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

AFNetworking:返回 200 且无内容时运行失败块

iOS开发之AFNetworking 3.0.4使用

AFNetworking 发布表单数据

AFNetworking:重用方法

第三方类AFNetworking

AFNetworking - 可达性总是返回 -1