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 for UIImageView+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 未设置远程图像的主要内容,如果未能解决你的问题,请参考以下文章

ios基础篇(三十)—— AFNetworking的使用

iOS开发网络数据之AFNetworking使用

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?

无法识别的选择器发送到 UIButton+AFNetworking.h 的实例(UIImageView+AFNetworking 也是)

AFNetworking 3.0迁移指南

AFNetworking 3.0迁移指南