Я написал быстрый метод Objective-C, использующий Amazon AWS iOS SDK для синхронной загрузки файла из моего Amazon S3 Bucket в мое приложение для iPad.Это корпоративное приложение, и я использую возможности обнаружения WiFi, прежде чем разрешить синхронизацию с S3.Он работает нормально для коротких загрузок (в килобайтах), но с файлами размером около 20-30 мегапикселей он будет продолжать загружаться в поток, и файл будет продолжать расти.Я не позволил ему проверить, остановится ли он в конечном итоге / произойдет сбой, но я наблюдал, как файл, который был 30 мегами, прошел 90 мег в моем iOS Simulator.Я прочитал несколько холодных тем, где некоторые испытали то же самое, и мне действительно нужен ответ.
Вот мой метод ...
- (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];
}
Переосмысливая ситуацию, яМне бы очень хотелось, чтобы мой метод использовал ASynchronous Request и использовал объект 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];
}
Как видите, я установил делегат S3GetObjectRequest с setDelegate для моего указателя S3RequestDelegate s3Delegate.Я добавил точки останова во все методы делегата объекта S3RequestDelegate, но ни один из них не выполняется.При поиске полученного файла на моем симуляторе, сейчас ничего не загружается.
В примере показано, что все, что вам нужно сделать, - это установить делегата, чтобы сделать его асинхронным.Кроме того, создается впечатление, что вам не нужно управлять потоковым объектом, и, независимо от того, делаете вы это или нет, ничего не загружается.Я устанавливаю делегат, и он никогда не запускает ни один из методов делегата;didReceiveResponse, didCompleteWithResponse, didReceiveData, didSendData, totalBytesExpectedToWrite, didFailWithError или didFailWithServiceException.