AFNetworking 3.0 не может загрузить изображение

Я пытаюсь загрузить изображение с помощью AFNetworking 3.0 следующим образом:

- (UIImage *) loadImage:(NSString *) link
 {
    __block UIImage *image = [UIImage imageNamed:@"no_user_profile_pic.png"];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFImageResponseSerializer serializer];
    [manager GET:[link stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]
      parameters:nil
        progress:nil
         success:^(NSURLSessionTask *task, id responseObject) {
             image = (UIImage *) responseObject;
         } failure:^(NSURLSessionTask *operation, NSError *error) {
             NSLog(@"Load Image error - %@", [error description]);
         }];
    return image;
}

и каждый раз я получаю эту ошибку:

*** Ошибка утверждения в -[AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:], /Users/.../AFNetworking/AFURLRequestSerialization.m:353

Я не могу понять, что я делаю неправильно. Что это за ошибка происходит?


person Eugene    schedule 15.03.2016    source источник
comment
Из журнала ошибок кажется, что «ссылка» может быть пустой.   -  person Bharat Modi    schedule 15.03.2016
comment
stringByAddingPercentEncodingWithAllowedCharacters: зашифрует URL-адрес, включая http://, он станет http%3A%2F%2F и больше не будет действительным URL-адресом.   -  person rckoenes    schedule 15.03.2016
comment
Попробуйте добавить точку останова исключения, чтобы получить точную строку, в которой находится ошибка.   -  person Bharat Modi    schedule 15.03.2016
comment
@ Бхарат Моди, спасибо.   -  person Eugene    schedule 15.03.2016


Ответы (6)


Если вы используете AFNetworking 3.0, вам необходимо добавить заголовочный файл AFImageDownloader.h:

#import <AFNetworking/AFImageDownloader.h>

и используйте метод downloadImageForURLRequest:

    NSString *stringVideo = [NSString stringWithFormat:@"https:%@", your link];
    AFImageDownloader *downloader = [[AFImageDownloader alloc] init];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: stringVideo]];
    [downloader downloadImageForURLRequest:request success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull responseObject) {

        NSLog(@"Succes download image");

    }failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) {

        NSLog(@"Error download image");
    }];
person AndrewSas    schedule 05.07.2017
comment
IMO лучше использовать [AFImageDownloader defaultInstance] для использования общего экземпляра AFImageDownloader. - person huong; 12.08.2017

Прошу прощения за потраченное вами время, ребята. Я заметил, что пара элементов из массива ссылок была пустой, после того как было добавлено условие проверки, я столкнулся с другой проблемой, связанной с типом содержимого ответа:

"неприемлемый тип содержимого: текстовый/обычный"

а также

«Error Domain = NSCocoaErrorDomain Code = 3840 «Операция не может быть завершена с помощью AFNetworking»

после того, как я попробовал пару вариантов:

manager.responseSerializer = [AFImageResponseSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

"manager.responseSerializer = [AFHTTPResponseSerializer serializer];" было правильным. Также имейте в виду, что вы используете асинхронный процесс, и менеджер получает ответ после того, как функция возвращает значение. Спасибо вам всем!

person Eugene    schedule 15.03.2016

Вы можете использовать прямой метод AFNetworking для загрузки изображения

NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:"YOUR URL OF IMAGE HERE"];
    ["YOUR IMAGEVIEW" setImageWithURLRequest:request placeholderImage:"YOUR PLACEHOLDER IMAGE" success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
        "YOUR IMAGEVIEW".image = image;
    } failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];

Надеюсь, эта штука поможет

person Jitendra Modi    schedule 26.09.2016

вы можете использовать :

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];
person Piyush    schedule 15.03.2016

Загрузка изображений была реорганизована в соответствии с архитектурой AlamofireImage с новым классом AFImageDownloader в AFNetworking 3.0.

person UdayM    schedule 15.03.2016

Используйте URLFragmentAllowedCharacterSet вместо URLHostAllowedCharacterSet

person Siju    schedule 15.03.2016