我在从网址加载图片以显示在表格中时遇到问题。我目前有以下代码来处理扩展UITableViewCell的类中的图像加载:
- (void) initWithData:(NSDictionary *) data{
NSDictionary *images = [data objectForKey:@"images"];
__block NSString *poster = [images objectForKey:@"poster"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSURL *posterURL = [[NSURL alloc] initWithString:poster];
NSData *imageData = [NSData dataWithContentsOfURL:posterURL];
if (imageData != nil) {
dispatch_async(dispatch_get_main_queue(), ^{
// 4. Set image in cell
self.backgroundImage.image = [UIImage imageWithData:imageData];
[self setNeedsLayout];
});
}
});
self.backgroundImage.image = [UIImage imageNamed:@"static"];
}
从 tableView:cellForRowAtIndexPath:delegate中的ViewController调用initWithData方法。一切正常,直到我滚动。从我读到的,TableView单元格被回收,因为图像被异步加载,我得到的图像行错误。此外,图像不会被缓存,只要显示单元格就会再次加载。
例如:滚动到中间并立即向上滚动。第一个单元格将具有与未完成加载的中间单元格对应的图像。
任何帮助或建议?非常感谢你:))
答案 0 :(得分:1)
首先,正如提到的评论,我肯定会建议使用现有的框架/组件来完成这项工作。
最佳候选人可能是:
https://github.com/rs/SDWebImage
https://github.com/enormego/EGOImageLoading
或者如果您还想要一个通用网络库
https://github.com/AFNetworking/AFNetworking
也就是说,如果您仍想自己尝试,可能需要使用indexPath作为键来实现NSMutableDictionary的缓存,并将图像作为值。
假设您有一个初始化的实例变量NSMutableDictionary *imageCache
在您的cellForRowAtIndexPath
方法中,在尝试进行任何图片加载之前,您会通过执行以下操作来检查您的缓存是否已有此索引的图像
if(! imageCache[indexPath])
{
// do your web loading here, then once complete you do
imageCache[indexPath] = // the new loaded image
}
else
{
self.backgroundImage.image = imageCache[indexPath];
}