S3TransferManager не может сохранить файл / данные на S3GetObjectRequest targetFilePath в ios

Я разработчик iOS, использующий Amazon S3 для загрузки и загрузки данных. Я успешно загрузил много файлов изображений, но когда я пытаюсь загрузить все эти файлы, я не могу сохранить данные или файл по заданному пути 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]; 
}

При выполнении этого он не сохраняет данные на целевом пути.

1 ответ

- download: является асинхронным методом и возвращает сразу. Поскольку вы не сохраняете сильную ссылку на экземпляр S3TransferManager, он может быть выпущен до завершения загрузки. Вы должны держать сильную ссылку на transferManager,

Обратите внимание, что вы используете устаревшую версию AWS SDK. Возможно, стоит перейти на версию 2 AWS Mobile SDK для iOS. С последней версией SDK вам не нужно беспокоиться о проблеме сохранения памяти, с которой вы сталкиваетесь.

Другие вопросы по тегам