我想使用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?
答案 0 :(得分:6)
只是不要使用图像序列化器。我认为这应该有效:
imageOperation.responseSerializer = [AFHTTPResponseSerializer serializer];
有关不同AFNetworking序列化选项的更多信息here。
答案 1 :(得分:4)
我刚刚攻击了一个使用Robs类别的动画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];
}
答案 2 :(得分:1)
您可以使用NSURLConnection的sendAsynchronousRequest:queue:completionHandler,其完成块返回NSData。
或者我想你可以将从AFNetworking方法检索到的UIImage转换为带UIImagePNGRepresentation(image)的NSData,但效率稍差。