AFNetworking 可以轻松返回 UIImage,但我如何返回 NSData?
Posted
技术标签:
【中文标题】AFNetworking 可以轻松返回 UIImage,但我如何返回 NSData?【英文标题】:AFNetworking can easily return a UIImage, but how do I return NSData? 【发布时间】:2013-12-11 18:34:32 【问题描述】:我想使用this 类别从 NSData 创建 UIImage GIF。我不想使用 dataWithContentsOfURL
方法,因为它阻塞了主线程,所以我想像往常一样使用 AFNetworking 来获取 NSData。
对于图像,我总是这样做:
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:post.url]];
AFHTTPRequestOperation *imageOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
imageOperation.responseSerializer = [AFImageResponseSerializer serializer];
然后在完成块之后start
它。但这会返回一个 UIImage。如何使用 AFNetworking 异步获取 NSData?
【问题讨论】:
【参考方案1】:不要使用图像序列化程序。我认为这应该可行:
imageOperation.responseSerializer = [AFHTTPResponseSerializer serializer];
更多关于不同的 AFNetworking 序列化选项here。
【讨论】:
【参考方案2】:我刚刚一起破解了一个使用 Rob 类别的动画 gif 序列化类。 它——当然——不完整,它只能在 ios 上运行。
界面:
#import <AFNetworking/AFURLResponseSerialization.h>
@interface VSAnimatedGIFResponseSerializer : AFImageResponseSerializer
@end
实现:
#import "VSAnimatedGIFResponseSerializer.h"
#import "UIImage+animatedGIF.h"
@implementation VSAnimatedGIFResponseSerializer
- (instancetype)init
self = [super init];
if (!self)
return nil;
self.acceptableContentTypes = [[NSSet alloc] initWithObjects: @"image/gif", nil];
return self;
+ (NSSet *)acceptablePathExtensions
static NSSet * _acceptablePathExtension = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
_acceptablePathExtension = [[NSSet alloc] initWithObjects:@"gif", nil];
);
return _acceptablePathExtension;
- (id)responseObjectForResponse:(NSURLResponse *)response
data:(NSData *)data
error:(NSError *__autoreleasing *)error
if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error])
if ([(NSError *)(*error) code] == NSURLErrorCannotDecodeContentData)
return nil;
return [UIImage animatedImageWithAnimatedGIFData:data];
@end
用法:
- (void)viewDidLoad
[super viewDidLoad];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.bildschirmarbeiter.com/content/anigifs/animated-gifs-39/animated-gifs-39-001.gif"]];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [VSAnimatedGIFResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, UIImage *responseObject)
NSLog(@"JSON: %@", responseObject);
UIImageView *imgView = [[UIImageView alloc] initWithImage:responseObject];
imgView.center = self.view.center;
[self.view addSubview:imgView];
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
[[NSOperationQueue mainQueue] addOperation:op];
【讨论】:
【参考方案3】:您可以使用 NSURLConnection 的 sendAsynchronousRequest:queue:completionHandler,其完成块返回 NSData。
或者我想您可以使用UIImagePNGRepresentation(image) 将从 AFNetworking 方法检索到的 UIImage 转换为 NSData,但效率会低一些。
【讨论】:
以上是关于AFNetworking 可以轻松返回 UIImage,但我如何返回 NSData?的主要内容,如果未能解决你的问题,请参考以下文章