AFNetworking setImageWithURLRequest не устанавливает удаленное изображение
Я использую AFNetworking UIImageView+AFNetworking.h
для асинхронной загрузки онлайн-изображения на UIImageView
.
Удаленное изображение загружается очень хорошо, когда я использую setImageWithURLRequest:
, но когда я пытаюсь использовать setImageWithURLRequest:placeholderImage:success:failure
, удаленное изображение загружается, но UIImageView не устанавливает его как UIImage.
Здесь мой код:
@property (strong) IBOutlet UIImageView *imageView;
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[_imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://i.imgur.com/fVhhR.png"]]
placeholderImage:nil
success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image ){
NSLog(@"Loaded successfully: %d", [response statusCode]);
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){
NSLog(@"failed loading: %@", error);
}
];
}
Изображение всегда загружается успешно, код состояния всегда 200
. Но я должен добавить [_imageView setImage:image];
в блок success
для UIImageView
, чтобы установить изображение.
Я использую iOS 6.0
Любые идеи?
Ответы
Ответ 1
Если вы предоставите блок успеха, вы несете ответственность за настройку свойства изображения вашего UIImageView. Если вы поставили блок успеха nil, то AFNetworking сделает это за вас.
Это соответствующий раздел UIImageView+AFNetworking.m
(строка 117):
if (success) {
success(operation.request, operation.response, responseObject);
} else {
self.image = responseObject;
}
В качестве альтернативы просто используйте -setImageWithURL:placeholderImage:
без блоков завершения.
Ответ 2
У меня была такая же проблема, и после того, как я разочаровался в документах для библиотеки, я нашел то, что упоминал Робин. Итак, теперь я использую:
[imageView setImageWithURLRequest:imageRequest placeholderImage:nil success:nil failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Unable to retrieve image");
}];
Работает как шарм. Надеюсь, это поможет.
Ответ 3
Документ очень ясен:
Если задан блок успеха, он отвечает за блок для установки изображения изображения перед возвратом. Если нет успеха блок задан, поведение по умолчанию установки изображения с self.image = image
.
Таким образом, вы можете либо пройти нулевой блок для успеха (как упоминалось выше), либо вызвать setImage: изображение самостоятельно, если вы укажете блок
Ответ 4
В вашем блоке успеха вам нужно указать UIImaage *image
на UIImageView
. Я предполагаю, что вы получаете NSLog(@"Loaded successfully: %d", [response statusCode]);
Кроме того, оно выглядит следующим образом: nil
. Разве вы не хотите, чтобы местозаполнитель был похож на загружаемое изображение?
Ответ 5
Для тех, кто наткнулся на эту проблему и попал сюда во время просмотра и поиска в Интернете, вот еще одна причина - изображение может иметь неправильное расширение файла. Например, изображение может быть сохранено как jpg, но кто-то решил изменить его расширение файла на png.
Здесь, как проверить это: сначала вам нужно использовать инструмент сетевого мониторинга (например, Charlie) и проверить HTTP-заголовок запроса Content-Type. Предположим, что он имеет значение "image/png". Это означает, что изображение на бэкэнде имеет расширение файла png. Теперь запустите приложение на симуляторе, затем перейдите в папку симулятора вашего приложения:
/Пользователи/вы/Library/Поддержка приложений /iPhone simulator/select-folder-with-your-iOS-версия/Приложения/YourApp/Library/Caches/yourAppBundleId/fsCachedData/
Найдите файл изображения и добавьте расширение png или jpg в этот файл (AFNetworking кэширует файлы изображений без расширения файла, поэтому его нужно добавить, чтобы открыть его с помощью Preview). Откройте его с помощью Preview и нажмите Tools/Show Inspector. Проверьте "Тип документа" на открытой панели. Если это отличается от "PNG-изображения" (например, изображение в формате JPEG), то это причина, и вам нужно исправить само изображение на бэкэнд - откройте его с помощью соответствующей программы редактирования изображений и сохраните ее как PNG.