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

时间:2014-01-30 20:16:02

标签: ios objective-c afnetworking-2

我正在使用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"

4 个答案:

答案 0 :(得分:13)

您可以在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"]
];

答案 1 :(得分: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];

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

对于使用AFNetworking 3.0的用户,您只需在共享会话管理器上更新responseSerializer。

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