0

私は Amazon S3 を使用してデータのアップロードとダウンロードを行う iOS 開発者です。多くの画像ファイルを正常にアップロードしましたが、それらすべてのファイルをダウンロードしようとすると、データまたはファイルを のターゲット パスに保存できませんS3GetObjectRequest。を通じてオブジェクトをリクエストしていS3TransferManagerます。

以下は私のコードです

- (void)listObjects:(id)sender {

    self.collection = [[NSMutableArray alloc] init];

    s3Client = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY];

    @try {

        S3ListObjectsRequest *req = [[S3ListObjectsRequest alloc] initWithName:AMAZON_BUCKET_NAME];
        req.prefix = @"arvinds/8/";
        //req.prefix = [NSString stringWithFormat:@"%@", self.appUser.userEmail];
        S3ListObjectsResponse *resp = [s3Client listObjects:req];

        NSMutableArray* objectSummaries = resp.listObjectsResult.objectSummaries;

        for (int x = 0; x < [objectSummaries count]; x++) {
            NSLog(@"objectSummaries: %@",[objectSummaries objectAtIndex:x]);

            S3ObjectSummary *s3Object = [objectSummaries objectAtIndex:x];

            NSString *downloadingFilePath = [[NSTemporaryDirectory() stringByAppendingPathComponent:@"download"] stringByAppendingPathComponent:s3Object.key];


            NSURL *downloadingFileURL = [NSURL fileURLWithPath:downloadingFilePath];
            NSLog(@"downloadingFilePath--- %@",downloadingFilePath);

            if ([[NSFileManager defaultManager] fileExistsAtPath:downloadingFilePath]) {
                [self.collection addObject:downloadingFileURL];
            } else {

                [self.collection addObject:downloadingFileURL];

                S3GetObjectRequest *getObj = [[S3GetObjectRequest new] initWithKey:s3Object.key withBucket:AMAZON_BUCKET_NAME];
                getObj.targetFilePath = downloadingFilePath;
                getObj.delegate = self;
                [self download:getObj];// Start downloding image and write in default folder
            }
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.GalleryCollectionView reloadData];
            //[self downloadAllRequestObject];
        });
    }
    @catch (NSException *exception) {
        NSLog(@"Cannot list S3 %@",exception);
    }
}


// Above code is for access all the objects stored on Amazon S3 server.

// Below code is for S3TransferManager request
- (void)download:(S3GetObjectRequest *)downloadRequest {
    S3TransferManager *transferManager = [S3TransferManager new];
    transferManager.s3 = s3Client;
    transferManager.delegate = self;
    [transferManager download:downloadRequest]; 
}

これを実行すると、対象のパスにデータが保存されません。

4

1 に答える 1

1

- download:は非同期メソッドであり、すぐに戻ります。のインスタンスへの強い参照を保持していないためS3TransferManager、ダウンロードが完了する前に解放される可能性があります。への強い参照を維持する必要がありますtransferManager

廃止されたバージョンの AWS SDK を使用していることに注意してください。AWS Mobile SDK for iOS のバージョン 2 に移行する価値があるかもしれません。SDK の最新バージョンでは、発生しているメモリ保持の問題について心配する必要はありません。

于 2015-06-18T18:40:03.547 に答える