AFNetworking 2 setImageWithURL 自定义响应类型 image/jpeg

Posted

技术标签:

【中文标题】AFNetworking 2 setImageWithURL 自定义响应类型 image/jpeg【英文标题】:AFNetworking 2 setImageWithURL custom response type image/jpeg 【发布时间】:2014-01-30 20:16:02 【问题描述】:

我正在使用 AFNetworking 2。我有一个 UITableview,每一行都包含一个图像。

问题在于响应类型是image/pjpeg,默认情况下它不是被接受的类型。为了解决这个问题,我在第 599 行附近修改了 AFURLResponseSerialization.m。将此内容类型添加到 self.acceptableContentTypes 声明的末尾。

我不想修改源代码。在 2.x 中是否有适当的方法来执行此操作?

NSString *url = [NSString stringWithFormat:@"%@my/images/%@",BaseUrl,[o objectForKey:@"ID"]];
[cell.imageView setImageWithURL:[NSURL URLWithString:url]
               placeholderImage:[UIImage imageNamed:@"placeholder"]
 ];

这似乎不再起作用:

[AFImageRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"image/jpeg"]]

更新:

我可以使用以下代码看到错误:

   NSURLRequest *urlRequest = [NSURLRequest requestWithURL: [NSURL URLWithString: url]];

__weak UITableViewCell *weakCell = cell;
[cell.imageView setImageWithURLRequest:urlRequest
                      placeholderImage:[UIImage imageNamed:@"placeholder"]
                        success: ^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 

                            __strong UITableViewCell *strongCell = weakCell;

                            strongCell.imageView.image = image;

                            [tableView reloadRowsAtIndexPaths: @[indexPath]
                                             withRowAnimation: UITableViewRowAnimationNone];
                            NSLog(@"Your image request succeeded!");
                         failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) 
                            NSLog(@"Your image request failed...");

                            NSLog(@"Error: %@", error);
                            NSLog(@"Error: %@", response);
                        

 ];

这是错误:

Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: image/pjpeg"

【问题讨论】:

您可能不需要更改代码和子类。事实上,“acceptableContentTypes”是 AFHTTPResponseSerializer 的一个属性,它是 AFImageResponseSerializer 的超类。因此,一旦您创建了 AFImageResponseSerializer,您没有尝试简单地为可接受的内容类型设置新值吗?您可以使用 [serializer setAcceptableContentTypes:[serializer.acceptableContentTypes setByAddingObject:@"image/jpeg"]] 将新的内容类型附加到原始内容类型;我没有测试这个,我只是猜测看代码。你试过这个解决方案了吗? 我没有创建AFImageResponseSerializer,上面的代码就是我的全部。我不知道在执行setImageWithURL 时如何修改序列化程序(我知道如何处理AFHTTPRequestOperationManager 之类的正常请求)。 请参阅下面 David Caunt 的回复。 【参考方案1】:

您可以在 UIImageView 实例上设置自己的imageResponseSerializer:

AFImageResponseSerializer *serializer = [[AFImageResponseSerializer alloc] init];
serializer.acceptableContentTypes = [serializer.acceptableContentTypes setByAddingObject:@"image/pjpeg"];
cell.imageView.imageResponseSerializer = serializer;

NSString *url = [NSString stringWithFormat:@"%@my/images/%@",BaseUrl,[o objectForKey:@"ID"]];
[cell.imageView setImageWithURL:[NSURL URLWithString:url]
               placeholderImage:[UIImage imageNamed:@"placeholder"]
];

【讨论】:

我刚试过,对我有用。 setImageWithURL 怎么知道使用serializer 您可以看到它here 和here - 序列化程序与图像视图相关联,然后在收到来自网络的响应时使用。 我仍然收到错误,我用附加代码更新了问题。 抱歉,我进行了编辑。当然,您需要在 imageView 上设置序列化程序。这对你有用吗? AFNetworking 没有办法。一种方法是使用您自己的 UIImageView 子类来设置序列化程序。或者,您可以添加自己的类别来加载,该类别设置序列化程序,然后调用 setImageWithURL 方法之一。【参考方案2】:

我找到了一种方法来为图像序列化设置一次接受的 MIME 类型,尽管它有点 hacky。 UIImageView+AFNetworking 为用户提供了一个 default AFImageResponseSerializer,结果是所有 UIImageView 实例的默认 instance is shared,除非设置了自定义序列化程序。

在应用启动时执行此代码将修改所有图像视图的默认行为:

AFImageResponseSerializer *serializer =
    [[[UIImageView alloc] init] imageResponseSerializer];
NSSet *mimeTypes = [serializer.acceptableContentTypes 
    setByAddingObjectsFromArray:@[@"image/pjpeg", @"image/x-png"]];
[serializer setAcceptableContentTypes:mimeTypes];

这种方法对我来说非常有效,但请注意,这不依赖于任何公共合同,并且可能会在未来的版本中发生变化。如果您选择使用它,请用单元测试覆盖它,以确保该实例确实是共享的。

如果您执行类似的操作,该方法也会中断

imageView.imageResponseSerializer = [[AFImageResponseSerializer alloc] init];

因为它将用未修改的默认行为替换共享实例。

【讨论】:

【参考方案3】:

对于那些使用 AFNetworking 3.0 的用户,您可以简单地更新共享 sessionManager 上的 responseSerializer。

AFImageResponseSerializer* serializer = (AFImageResponseSerializer*)      [UIImageView sharedImageDownloader].sessionManager.responseSerializer;
serializer.acceptableContentTypes = [serializer.acceptableContentTypes setByAddingObject:@"image/jpg"];

【讨论】:

【参考方案4】:

如果您使用的是 RestKit 或 AFNetworking 1.3,请使用

[AFImageRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"image/pjpeg"]];

【讨论】:

以上是关于AFNetworking 2 setImageWithURL 自定义响应类型 image/jpeg的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0 对现有项目的更新

AFNetworking 2.2.1 中的错误

AFNetworking 2.0 JSON 解析

AfNetworking 2.0 发布问题

AFNetworking 2.0.0 后台下载

AFNetworking 2.0.3 不适用于 iOS 6