AFNetworking setImageWithURLRequest 未设置远程图像
Posted
技术标签:
【中文标题】AFNetworking setImageWithURLRequest 未设置远程图像【英文标题】:AFNetworking setImageWithURLRequest not setting remote image 【发布时间】:2012-11-12 16:08:27 【问题描述】:我正在使用 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:
而不使用完成块。
【讨论】:
这是正确的答案,但我想我可以补充一下:最近对 1.0.1 进行了此更改,以便开发人员可以在需要时指定转换,或进行某种处理。这在 CHANGES 中有记录,现在也在网站文档中。此处进行了更改:github.com/AFNetworking/AFNetworking/commit/…【参考方案2】:我遇到了同样的问题,在对图书馆的文档感到沮丧之后,我找到了 Robin 上面提到的内容。所以现在我正在使用:
[imageView setImageWithURLRequest:imageRequest placeholderImage:nil success:nil failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
NSLog(@"Unable to retrieve image");
];
像魅力一样工作。我希望这有帮助。
【讨论】:
【参考方案3】:文档很清楚:
如果指定了成功块,则由该块负责 在返回之前设置图像视图的图像。如果没有成功 块被指定,设置图像的默认行为
self.image = image
已应用。
所以你可以传递一个 nil 块以获得成功(如上所述),或者如果你指定一个块,你可以自己调用 setImage:image
【讨论】:
【参考方案4】:在您的成功块中,您需要将UIImaage *image
提供给您的UIImageView
。我假设你收到了NSLog(@"Loaded successfully: %d", [response statusCode]);
另外,您的占位符图片似乎是nil
。你不想要一个像加载图像这样的占位符吗?
【讨论】:
AFNetworking 的documentation forUIImageView+AFNetworking.h
声明“如果本地缓存图片,则立即设置图片,否则立即设置指定占位符图片,然后设置远程图片一旦请求完成。”在我的情况下,它没有在本地缓存,所以它应该立即设置,它不是。我确实将占位符图像设置为 nil,但这没关系...
请参阅下面的答案 - 文档不清楚。看源代码。
文档与其说是“不清楚”不如说是“过时”。行为发生了变化,文档没有重新上传。【参考方案5】:
对于那些在网络上浏览和搜索时偶然发现此问题并来到这里的人,还有另一个原因 - 图像的文件扩展名可能有误。例如,图像可能保存为 jpg,但有人决定将其文件扩展名更改为 png。
检查方法如下:首先,您需要使用网络监控工具(例如 Charlie)并检查图像请求“Content-Type”HTTP 标头。假设它的值是“image/png”。这意味着后端的图像具有 png 文件扩展名。现在,在模拟器上运行您的应用,然后转到应用的模拟器文件夹:
/Users/you/Library/Application Support/iPhone 模拟器/select-folder-with-your-iOS-version/Applications/YourApp/Library/Caches/yourAppBundleId/fsCachedData/
找到你的图片文件,并为这个文件添加 png 或 jpg 扩展名(AFNetworking 缓存没有文件扩展名的图片文件,因此需要添加它才能使用预览打开它)。使用预览打开它,然后按工具/显示检查器。在打开的面板中检查“文档类型”。如果它与“PNG 图像”(例如 JPEG 图像)不同,那么这就是原因,您需要在后端修复图像本身 - 使用适当的图像编辑程序打开它并将其保存为 PNG。
【讨论】:
以上是关于AFNetworking setImageWithURLRequest 未设置远程图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?
无法识别的选择器发送到 UIButton+AFNetworking.h 的实例(UIImageView+AFNetworking 也是)