将NSData转换为UIImage - 使用NSURLRequest

时间:2014-08-30 21:32:59

标签: objective-c uiimage nsurlconnection nsdata nsurlrequest

我一直在使用AFHTTPRequestOperationManager调用我的服务返回一个图像,我的代码看起来像这样:

NSString *baseURLString = @"http://get_image/";

@try {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:baseURLString
      parameters:nil
         success:^(AFHTTPRequestOperation *operation, id responseObject) {
             NSString *imageStr = responseObject[0];
              if([imageStr isKindOfClass:[NSNull class]]==NO)
              {
              NSData *imageData = [NSData   dataWithBase64EncodedString:imageStr];
              UIImage *image = [UIImage imageWithData:imageData];
              self.myImage = (image==nil)? [UIImage imageNamed:@"noPhoto"]: image;
              }
         }
         failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             self.myImage = [UIImage imageNamed:@"noPhoto"];
         }];
}
@catch (NSException *exception) {
    NSLog(@"exception %@", exception);
}

因为AFHTTPRequestOperationManager是异步的,我需要同步调用,如何完成此代码以生成我的图像:

NSString *baseURLString = @"http://get_image/";
NSURLResponse *response;
NSError *error;

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:p_baseURLString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];

// Make synchronous request
NSData *imageRequest = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

???

UIImage *image = [UIImage imageWithData:imageData];
self.displayedApartment.exteriorImage = (image==nil)? [UIImage imageNamed:@"noPhoto"]: image;

这是我试过的代替???全部导致image = nil

  • 按原样使用imageRequest数据
  • 使用[[NSData alloc] initWithBase64EncodedData:imageRequest options:0];
  • 将imageRequest转换为base64
  • 将其转换为字符串并返回NSData

    NSData NSString *imageStr = [NSString stringWithUTF8String:[imageRequest bytes]]; NSData *imageData = [NSData dataWithBase64EncodedString:imageStr];

2 个答案:

答案 0 :(得分:0)

如果我正确阅读您的代码,我认为您的变量名称可能会造成一些麻烦。请尝试替换以下行:

NSData *imageRequest = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

NSData *imageData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

然后看看UIImage *image = [UIImage imageWithData:imageData];给你的是什么。除非请求中存在错误,否则我无法看到image无法正确实例化的原因,除非它不代表图像对象。

答案 1 :(得分:0)

为什么不使用AFNetworking函数setImageWithURL显示图像,它会获取图像的URL并将UIImageView设置为该图像。如果你只需要显示它,它就是一种更简单的做事方式。

它看起来像这样:

    [imageView setImageWithURL:[NSURL URLWithString:p_baseURLString]];

在标题文件中,您将有以下内容:

      @property (weak, nonatomic) IBOutlet UIImageView *imageView;

它的速度也快得多。