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 вам не нужно беспокоиться о проблеме сохранения памяти, с которой вы сталкиваетесь.