AFNetworking可以轻松返回UIImage,但是如何返回NSData?

时间:2013-12-11 18:34:32

标签: ios objective-c nsurlconnection afnetworking nsdata

我想使用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?

3 个答案:

答案 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,但效率稍差。