【问题标题】:AFNetworking can easily return a UIImage, but how do I return NSData?AFNetworking 可以轻松返回 UIImage,但我如何返回 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?

【问题讨论】:

    标签: ios objective-c nsurlconnection 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,但效率会低一些。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-29
          • 1970-01-01
          • 2019-08-01
          • 1970-01-01
          • 2016-03-14
          • 1970-01-01
          相关资源
          最近更新 更多