我正在使用自定义UITableViewCell实现UITableView。那里有UIImageView用于显示一些图像。但是我给出的api,不包含我必须在每个UITableViewCell中显示的图像的下载链接。为了获取图像,我需要调用另一个GET请求,该请求返回要在相应Cell上显示的图像的字节数组流。
我知道,我可以从api制作来自NSData的图像。但我不确定会有多大的效率,我担心内存和性能问题。我想在UITableViewCell和图像缓存中进行异步加载,以便在以后的调用中花费更少的时间。那么,这里有什么有效的方法呢?还有一些关于可以帮助我做这件事的好图书馆的建议会很棒。
答案 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);
}
}];
}