S3RequestDelegateメソッドがAWS IOS SDK 1.0.1のS3GetObjectRequestに対して実行されていません

私はAmazonのAWS iOS SDKを使用してiPadアプリ内のAmazon S3バケットからファイルを同期的にダウンロードする、簡単な目的のCメソッドを作成しました。これはエンタープライズアプリケーションであり、S3との同期を許可する前に到達可能性を使用してWiFiを検出しています。短いダウンロード(キロバイト単位)では正常に動作しますが、20〜30メガ程度のファイルがあれば、ストリームにダウンロードし続け、ファイルは引き続き増加します。私はそれが最終的に停止/クラッシュするかどうかを見に行くことはできませんでしたが、私は30メグスだったファイルを見てきました。私はいくつかのコールドスレッドを読みましたが、いくつかは同じことを経験しており、本当に答えが必要です。

ここに私の方法です...

    - (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]; 
    }

状況を再評価するために、私は本当に非同期要求を使用してメソッドを取得し、S3RequestDelegateオブジェクトを使用してダウンロード中のbytesInを更新するのを手伝っていきたいと思います。彼らのアーカイブには、S3AsyncViewControllerのサンプルがあり、私が望むことをする方法を示す必要があります。 S3RequestDelegate.h/.mをプロジェクトに追加し、S3RequestDelegateを私の.hのように実装しました。

    #import "S3RequestDelegate.h"

    ... {
        S3RequestDelegate *s3Delegate;
    }

私はretrieveRemoteFileメソッドを少し変更しました(これは一日一貫して変更されており、私はどこにもいません)

    - (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]; 
    }

ご覧のとおり、setDelegateを使ってS3GetObjectRequestデリゲートをS3RequestDelegateポインタs3Delegateに設定しました。 S3RequestDelegateオブジェクトのすべてのデリゲートメソッドにブレークポイントを追加しましたが、それらのどれも実行されていません。私のシミュレータで受信したファイルを探しているうちに、今でもダウンロードされているものはありません。

サンプルでは、​​デリゲートを非同期にするように設定するだけで済みます。また、ストリームオブジェクトを管理する必要がないように見えます。そうしてもいなくても、何もダウンロードされません。私はデリゲートを設定しているので、デリゲートメソッドを実行することはありません。 didReceiveResponse、didCompleteWithResponse、didReceiveData、didSendData、totalBytesExpectedToWrite、didFailWithErrorまたはdidFailWithServiceExceptionがあります。

1

1 答え

私は、OperationsQueueで実行するように要求しました。このコードを削除し、メインスレッドで非同期転送を開始し、デリゲート関数は配列内の次のファイルの転送を処理します。私はステータスバーとキャンセルボタンを組み込み、それは素晴らしい仕事をしました。

3
追加された
私はこの問題について助けが必要です。私は同じ種類の問題を抱えています。私はメッセージ(s3にアップロードするファイルを含む)を持っていて、バックグラウンドで停止キューで操作を開始します。バックグラウンドですべてのメッセージとファイルをアップロードする必要があります。メインスレッドでこれを実現しますか?応答は非常にappriciatedされます。
追加された 著者 Moaz Saeed,