Подтвердить что ты не робот

Загрузите файл/изображение с 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 - это прямая ссылка на изображение, которое я хочу загрузить.

Поскольку этот метод вызывается для всех изображений, все журналы вызываются несколько раз и, кажется, верны.

4b9b3361

Ответ 1

У вас здесь несколько проблем. во-первых, почему вы используете @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];
}

Ответ 2

Проблема в том, что операция не сохраняется. Он будет немедленно освобожден.

Либо сделайте операцию свойством своего класса, либо пусть очередь операций (также свойство) обрабатывает запрос для вас (рекомендуется). В последнем случае не вызывайте [operation start]. При использовании AFHTTPClient для вас также будет управляться очередь операций.

Также вы должны зарегистрировать обратный вызов завершения для операции запроса (setCompletionBlockWithSuccess:failure:).