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的主要内容,如果未能解决你的问题,请参考以下文章