Скачать файл / изображение с AFNetworking в iOS?
Я думал, что понял это, но я просто не могу заставить это работать. У меня есть метод, который вызывается на каждый URL в массиве. Этот метод имеет URL-адрес изображения, которое необходимо загрузить по определенному пути в папке поддержки приложений для автономного использования. Но, возможно, я неправильно интерпретирую методы в библиотеке AFNetwork. Мой метод выглядит так:
- (void) downloadImageInBackground:(NSDictionary *)args{
@autoreleasepool {
NSString *photourl = [args objectForKey:@"photoUrl"];
NSString *articleID = [args objectForKey:@"articleID"];
NSString *guideName = [args objectForKey:@"guideName"];
NSNumber *totalNumberOfImages = [args objectForKey:@"totalNumberOfImages"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photourl]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.inputStream = [NSInputStream inputStreamWithURL:[NSURL URLWithString:photourl]];
[operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:^{
DLog(@"PROBLEMS_AF");
}];
DLog(@"URL_PHOTOURL: %@", photourl);
DLog(@"indexSet: %@", operation.hasAcceptableStatusCode);
[operation response];
NSData *data = [args objectForKey:@"data"];
NSString *path;
path = [NSMutableString stringWithFormat:@"%@/Library/Application Support/Guides", NSHomeDirectory()];
path = [path stringByAppendingPathComponent:guideName];
NSString *guidePath = path;
path = [path stringByAppendingPathComponent:photourl];
if ([[NSFileManager defaultManager] fileExistsAtPath:guidePath]){
[[NSFileManager defaultManager] createFileAtPath:path
contents:data
attributes:nil];
}
DLog(@"path: %@", path);
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation start];
DLog(@"isExecuting: %d",[operation isExecuting]);
DLog(@"IS_FINISHED: %d",[operation isFinished]);
}
}
PhotoURL - это прямая ссылка на изображение, которое я хочу скачать.
Поскольку этот метод вызывается для всех изображений, все журналы вызываются несколько раз и, похоже, являются правильными.
2 ответа
У вас есть несколько проблем здесь. Итак, во-первых, почему вы используете @autoreleasepool
? Я думаю, что здесь нет необходимости. Кроме того, вы используете ARC? я рассматриваю это, для остальной части моего ответа.
в AFNetworking есть класс под названием AFImageRequestOperation
, так что это будет хорошей идеей для вас. во-первых, импортировать его
#import "AFImageRequestOperation.h"
тогда вы могли бы создать объект
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photourl]];
AFImageRequestOperation *operation;
operation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
cacheName:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"%@", [error localizedDescription]);
}];
теперь, в блоке успеха, вы получили UIImage, который вам нужен. там вам нужно получить каталог документов. Ваш код не будет работать на устройстве IOS.
// Get dir
NSString *documentsDirectory = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
NSString *pathString = [NSString stringWithFormat:@"%@/%@",documentsDirectory, guideName];
и тогда вы можете использовать NSDatas writeToFile
// Save Image
NSData *imageData = UIImageJPEGRepresentation(image, 90);
[imageData writeToFile:pathString atomically:YES];
наконец, вам нужно начать операцию
[operation start];
все вместе:
- (void)downloadImageInBackground:(NSDictionary *)args{
NSString *guideName = [args objectForKey:@"guideName"];
NSString *photourl = [args objectForKey:@"photoUrl"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photourl]];
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
cacheName:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// Get dir
NSString *documentsDirectory = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
NSString *pathString = [NSString stringWithFormat:@"%@/%@",documentsDirectory, guideName];
// Save Image
NSData *imageData = UIImageJPEGRepresentation(image, 90);
[imageData writeToFile:pathString atomically:YES];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"%@", [error localizedDescription]);
}];
[operation start];
}
Проблема здесь в том, что операция не сохраняется. Он будет немедленно освобожден.
Либо сделайте операцию свойством вашего класса, либо разрешите очереди операций (также свойству) обрабатывать запрос для вас (рекомендуется). В последнем случае не звоните [operation start]
, Когда вы используете AFHTTPClient
Очередь операций также будет управляться за вас.
Также вы должны зарегистрировать обратный вызов завершения для операции запроса (setCompletionBlockWithSuccess:failure:
).