AFNetworking puede devolver fácilmente un UIImage, pero ¿cómo puedo devolver NSData?

Quiero usar esta categoría para crear UIImage GIF desde NSData. No quiero usar el método dataWithContentsOfURL ya que bloquea el hilo principal, por lo que quiero usar AFNetworking como lo hago normalmente para get el NSData.

Con imágenes, siempre he hecho algo como esto:

 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:post.url]]; AFHTTPRequestOperation *imageOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; imageOperation.responseSerializer = [AFImageResponseSerializer serializer]; 

Y luego start después de un bloque de finalización. Pero eso devuelve un UIImage. ¿Cómo puedo get de forma asíncrona NSData con AFNetworking?

Simplemente no use el serializador de imágenes. Creo que esto debería funcionar:

 imageOperation.responseSerializer = [AFHTTPResponseSerializer serializer]; 

Más sobre las diferentes opciones de serialization de AFNetworking aquí .

Acabo de piratear una class de serialization GIF animada que usa la categoría Robs.
Es, de seguro, no completo, solo funcionará en iOS.

interfaz:

 #import <AFNetworking/AFURLResponseSerialization.h> @interface VSAnimatedGIFResponseSerializer : AFImageResponseSerializer @end 

implementación:

 #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 

Uso:

 - (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]; } 

Podría usar sendAsynchronousRequest sendAsynchronous NSonLConnection: queue: completionHandler , cuyo bloque de finalización devuelve NSData.

O supongo que podría convertir el UIImage recuperado del método AFNetworking a NSData con UIImagePNGRepresentation (image) pero que es un poco less eficiente.