在UITableViewCell中从字节数组流加载图像

时间:2013-07-25 16:04:00

标签: uitableview cocoa-touch uikit lazy-loading image-loading

我正在使用自定义UITableViewCell实现UITableView。那里有UIImageView用于显示一些图像。但是我给出的api,不包含我必须在每个UITableViewCell中显示的图像的下载链接。为了获取图像,我需要调用另一个GET请求,该请求返回要在相应Cell上显示的图像的字节数组流。

我知道,我可以从api制作来自NSData的图像。但我不确定会有多大的效率,我担心内存和性能问题。我想在UITableViewCell和图像缓存中进行异步加载,以便在以后的调用中花费更少的时间。那么,这里有什么有效的方法呢?还有一些关于可以帮助我做这件事的好图书馆的建议会很棒。

2 个答案:

答案 0 :(得分:0)

您需要自己下载图像,可能在桌面视图控制器或模型中。要节省存储空间,可以调整图像大小。理想情况下,这将在服务器端完成以节省带宽。但是,您也可以在下载后调整大小。请记住,视网膜和非视网膜设备将有不同的图像大小调整需求。

无论哪种方式,都将已调整大小的图像与其他单元格数据一起缓存并丢弃NSData。然后,您可以通过在UITableview上调用reloadRowsAtIndexPaths:withRowAnimation:来刷新单元格。

如果您有大量带有图像的行,则可以将图像写入磁盘并释放内存。但一般情况下,最好避免命中磁盘来加载单元格数据,以便保持滚动表格顺畅。为了提高性能,您可以根据表格滚动位置预测需要的图像并智能地加载转储图像。您需要在单独的线程上进行加载,以防止影响滚动性能。

答案 1 :(得分:0)

这就是我解决它的方法。我还没有使用过缓存,但这足以在UITableViewCell中正确显示它们。这是我用过的方法。

+ (void)downloadImageWithURL:(NSMutableURLRequest *)request completionBlock:(void (^)(BOOL succeeded, UIImage *image))completionBlock
{
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

                               NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
                               int statusCode = httpResponse.statusCode ;
                               NSLog(@"Status Code Imageloading : %d" , statusCode);

                               if(statusCode == 200){
                                   UIImage *image = [[UIImage alloc] initWithData:data];
                                   NSLog(@"Success");
                                   completionBlock(YES,image);
                               } else {
                                   NSLog(@"Failure");
                                   completionBlock(NO,nil);
                               }
    }];
}
相关问题