接收NSData并将其转换为UIImage与直接获取UIImage相比,是否存在性能损失?

时间:2014-02-19 22:18:50

标签: ios objective-c uiimage nsdata nsurlsession

下载图片时,我通常会异步使用dataWithContentsOfURL:,但它总是返回UIImage

网络上的所有数据最初都是NSData的形式吗?或者将其下载为NSData,然后将其转换为UIImage作为浪费,我应该尝试直接将其下载为UIImage

3 个答案:

答案 0 :(得分:2)

基本上,他们是DO相同的事情(无论哪种方式你得到NSData),所以 NO 性能损失。如果您想 改善 效果,请尝试SDWebImage(请参阅:https://github.com/rs/SDWebImage)。该库缓存图像并异步下载它们。

答案 1 :(得分:0)

数据字节来自网络。这些字节可以被视为字节(如果您使用NSData作为它们的包装)或作为图像(如果包装器是UIImage)。底层数据字节是一样的,它只是告诉应用程序使用那些不同的字节。你需要编写多少代码就有所不同。

因此,使用哪个选项对您和您的情况更有意义。从长远来看,运行下载数据字节并向您返回图像的操作数量大致相同。

答案 2 :(得分:0)

使用dataWithContentsOfURL:是否存在“性能损失”并非没有。使用dataWithContentsOfURL:所损失的是很多功能,例如:

  • 无法遵循下载进度
  • 无法取消下载
  • 无法管理可能的身份验证过程
  • 您无法轻易处理错误,尤其重要 在iPhone上的移动开发当然(因为你经常 在真实条件下失去你的网络,所以非常重要 在为iOS开发时跟踪此类网络错误案例
假设{p> dataWithContentsOfURL:用于根据文档加载本地文件。来自文档:

  

重要:请勿使用此同步方法请求基于网络   网址。对于基于网络的URL,此方法可以阻止当前线程   在慢速网络上持续数十秒,导致用户不畅   经验,在iOS中,可能会导致您的应用被终止。

你应该使用的是(来自文档):

  

相反,对于非文件网址,请考虑使用   NSSession类的dataTaskWithURL:completionHandler:方法。

这就是你如何使用它:

-(void) sendHTTPGet
{
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

    NSURL * url = [NSURL URLWithString:@"http://theURL"];

    NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url
                                                         completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if(error == nil)
        {
            //use your data
        }

    }];

    [dataTask resume];

}