S3RequestDelegate-methoden worden niet uitgevoerd voor S3GetObjectRequest in AWS IOS SDK 1.0.1

Ik schreef een snelle objectieve-C-methode die Amazon's AWS iOS SDK gebruikt om een ​​bestand synchroon te downloaden van mijn Amazon S3 Bucket in mijn iPad-app. Dit is een zakelijke app en ik gebruik bereikbaarheid om WiFi te detecteren voordat synchronisatie met S3 wordt toegestaan. Het werkt prima voor korte downloads (die in kilobytes), maar met bestanden die rond 20-30 megs zijn, zal het blijven downloaden in de stream en het bestand zal blijven groeien. Ik heb het niet laten gaan om te zien of het uiteindelijk zal stoppen/crashen, maar ik heb een bestand bekeken dat 30 meg is voorbij 90 meg in mijn iOS Simulator. Ik heb verschillende koude discussies gelezen waarin sommigen hetzelfde hebben meegemaakt en ik heb echt een antwoord nodig.

Hier is mijn methode ...

    - (void)retrieveRemoteFile:(NSString *)fileName {
        NSString *destinationFileName = [NSString stringWithFormat:@"%@%@",[self getBucketDirectory],fileName];
        AmazonS3Client *s3 = [[[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY] autorelease];
        NSOutputStream *stream = [[NSOutputStream alloc] initToFileAtPath:destinationFileName append:NO];
        [stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [stream open];
        S3GetObjectRequest *request = [[S3GetObjectRequest alloc] initWithKey:fileName withBucket:BUCKET];
        request.outputStream = stream;
        [s3 getObject:request];
        [stream close];
        [stream release];
        [request release]; 
    }

De situatie opnieuw evalueren, ik zou graag mijn methode gebruiken met een ASynchronous Request en een S3RequestDelegate-object gebruiken om me te helpen de bytesIn bij te werken tijdens het downloaden. In hun archief is er een voorbeeld in S3AsyncViewController dat moet laten zien hoe ik moet doen wat ik wil. Ik heb S3RequestDelegate.h/.m aan mijn project toegevoegd en een S3RequestDelegate geïmplementeerd in mijn .h zoals dit ...

    #import "S3RequestDelegate.h"

    ... {
        S3RequestDelegate *s3Delegate;
    }

Ik heb mijn methode retrieveRemoteFile gewijzigd om er een beetje op te lijken (het is de hele dag veranderd en ik ben nergens gekomen)

    - (void)retrieveRemoteFile:(NSString *)fileName {
        NSString *destinationFileName = [NSString stringWithFormat:@"%@%@",[self getBucketDirectory],fileName];
        AmazonS3Client *s3 = [[[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY] autorelease];
        NSOutputStream *stream = [[NSOutputStream alloc] initToFileAtPath:destinationFileName append:NO];
        //[stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        //[stream open];
        S3GetObjectRequest *request = [[S3GetObjectRequest alloc] initWithKey:fileName withBucket:BUCKET];
        request.outputStream = stream;
        s3Delegate = [[S3RequestDelegate alloc] init];
        [request setDelegate:s3Delegate];
        [s3 getObject:request];
        //[stream close];
        //[stream release];
        //[request release]; 
    }

Zoals je ziet, heb ik de S3GetObjectRequest-gedelegeerde met setDelegate ingesteld op mijn S3RequestDelegate-aanwijzer s3Delegate. Ik heb breekpunten toegevoegd aan alle gedelegeerde methoden van het S3RequestDelegate-object, maar geen van beide worden uitgevoerd. Bij het zoeken naar een ontvangen bestand op mijn simulator, wordt niets nu zelfs gedownload.

Het voorbeeld zorgt ervoor dat het lijkt alsof u alleen een gedelegeerde hoeft in te stellen om deze asynchroon te maken. Het zorgt er ook voor dat u het stream-object niet hoeft te beheren en of u het wel of niet doet, er wordt niets gedownload. Ik stel de gedelegeerde in en het voert nooit een van de gedelegeerde methoden uit; didReceiveResponse, didCompleteWithResponse, didReceiveData, didSendData, totalBytesExpectedToWrite, didFailWithError of didFailWithServiceException.

1

1 antwoord

Ik was bezig met het opzetten van mijn verzoek om in een OperationsQueue te werken. Deze code is verwijderd en de asynchrone overdracht op de hoofdthread is gestart en de gedelegeerde functies zorgen voor de overdracht van het volgende bestand in de array. Ik heb een statusbalk en een annuleerknop opgenomen en het werkte prima.

3
toegevoegd
Ik heb hulp nodig voor dit probleem. omdat ik hetzelfde probleem heb. Ik heb berichten (die bestanden bevatten om te uploaden naar s3) en ik start de operaties in nsoperation-wachtrij op de achtergrond, omdat ik alle berichten en bestanden op de achtergrond moet uploaden terwijl de gebruiker de app kan gebruiken, wie ik kan haal dit op de rode draad? antwoord zal zeer gewaardeerd worden.
toegevoegd de auteur Moaz Saeed, de bron