显示 AFNetworking+UIImageView 占位符图像,但不显示 URL 图像

Posted

技术标签:

【中文标题】显示 AFNetworking+UIImageView 占位符图像,但不显示 URL 图像【英文标题】:AFNetworking+UIImageView placeholder image shows up, but not URL image 【发布时间】:2012-02-27 03:31:48 【问题描述】:

我正在尝试使用 AFNetworking UIImageView 调用从 URL 加载图像,如下所示:

[self.image setImageWithURL:[NSURL URLWithString:feed.imageURL] placeholderImage:     [UIImage imageNamed:@"logo"]];

占位符图像始终显示,但“feed.imageURL”中的实际图像从不显示。我已验证该 URL 实际上是正确的。我什至对其进行了硬编码以确保,但仍然没有。

我的基本应用设置是一个选项卡控制器...在 viewDidLoad 中,我调用了一个方法“fetchFeed”,它执行 HTTP 请求以收集我的 JSON 数据。

我的请求块看起来像:

AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                    JSONRequestOperationWithRequest:request
                                     success:^(NSURLRequest *request, NSHTTPURLResponse   *response, id JSON) 
                                         [self parseDictionary:JSON];
                                         isLoading = NO;
                                         [self.tableView reloadData];

                                          failure:^(NSURLRequest *request,   NSHTTPURLResponse *response, NSError *error, id JSON) 
                                             NSLog(@"Error: %@", error);
                                             [self showNetworkError];
                                             isLoading = NO;
                                             [self.tableView reloadData];
                                         ];
operation.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
[queue addOperation:operation];

【问题讨论】:

你的图片在 UITableViewCells 中吗?您是否在 cellForRowAtIndexPath: 委托方法中调用 setImageWithURL 是的,你的两个问题。 能否在tableView:cellForRowAtIndexPath:中包含用于设置远程图像的代码? Mattt,包含该代码。它在我的帖子的顶部。 【参考方案1】:

原来我请求图像的服务器正在发送content-type "image/jpg",默认情况下 AFNetworking 不支持这种文件类型。

我将 AFImageRequestOperation 中的类方法更改为:

+ (NSSet *)defaultAcceptableContentTypes 
return [NSSet setWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon" @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", @"image/jpg", nil];

它解决了我的问题。

【讨论】:

你成就了我的一天!对于 AFNetworking 2.0,它是 AFURLResponseSerialization.m 中的 self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/jpg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil]; 我应该如何使用这个? ,我想也有同样的问题! LINK【参考方案2】:

你可以通过这个库来接受你想要的content-type,只需像这样更改request

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:yourURL];
[request addValue:@"image/*" forHTTPHeaderField:@"Accept"];

并调用AFNetworking方法:

AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                     JSONRequestOperationWithRequest:request
                                     success:^(NSURLRequest *request, NSHTTPURLResponse   *response, id JSON) 
                                      failure:^(NSURLRequest *request,   NSHTTPURLResponse *response, NSError *error, id JSON) 
                                     ];

这样您将能够覆盖content-type 而无需更改库。

【讨论】:

【参考方案3】:

AFNetworking 默认不支持 image/jpg MIME TYPE

您无需修改​​ AFNetworking 库即可支持它

[AFImageRequestOperation addAcceptableContentType:@"image/jpg"];

【讨论】:

【参考方案4】:

所有操纵 UI 的操作都必须在主线程上执行。因此,在完成块中重新加载 tableview 数据时,您可能需要使用 'performSelectorOnMainThread:'。

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]

【讨论】:

好的建议 Jonkroll,但对我的事业没有帮助。 FWIW,所有 AFNetworking 回调块都默认在主线程上执行。【参考方案5】:

我遇到了类似的问题,但结果证明我传递的 URL 中包含空格。当我使用 stringByAddingPercentEscapesUsingEncoding: 正确编码 URL 时,图像现在加载。

【讨论】:

以上是关于显示 AFNetworking+UIImageView 占位符图像,但不显示 URL 图像的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 可达性警报始终显示

AFNetworking/NSURLConnection HTTPS 保持活动显示奇怪的行为

raywenderlich 的 AFNetworking 教程不在表格单元格上显示数据

AFNetworking 2.0 解析的数据未显示在表格视图中

AFNetworking 请求失败并显示 -999 错误代码

显示使用 AFNetworking 下载图像的进度