我在单元格中使用异步加载图像。 我的代码是:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *const ImageCellId = @"ImageCell";
PDATableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ImageCellId];
if (cell == nil) {
cell = [[PDATableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ImageCellId];
}
Tutorial *thisTutorial = [_objects objectAtIndex:indexPath.row];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *tutorialsUrl8 = [NSURL URLWithString:thisTutorial.url]];
NSData *tutorialsHtmlData2 = [NSData dataWithContentsOfURL:tutorialsUrl8];
TFHpple *tutorialsParser2 = [TFHpple hppleWithHTMLData:tutorialsHtmlData2];
NSString *tutorialsXpathQueryString2 = @"//div[@class='photo']/img";
NSArray *tutorialsNodes2 = [tutorialsParser2 searchWithXPathQuery:tutorialsXpathQueryString2];
for (TFHppleElement *element2 in tutorialsNodes2) {
tutorial2 = [[Tutorial alloc] init];
tutorial2.url = [element2 objectForKey:@"src"];
data2 = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:tutorial2.url]];
}
if(data2)
{
imageMain = [UIImage imageWithData:data2];
if (imageMain) {
dispatch_async(dispatch_get_main_queue(), ^{
if (cell)
cell.cellImageView.image = imageMain;
});
}
}
});
return cell;
}
有效!但!当我滚动TebleView时,我再次加载了图像。 我做错了什么?
答案 0 :(得分:1)
您正在异步加载图像。这很好,但你没有应用任何缓存机制。
通过缓存机制,我指的是一种检查图像是否已经下载的方法。如果下载一次,则不应再次下载图像,而是使用已下载的图像。
这些下载的图像应该保存在本地,以便每次应用程序处于活动状态时都可以使用它们。它很容易实现这种图像缓存机制,但它更好地使用现有的api,它们得到了很大的改进和优化。
SDWebImage是异步加载图像的最佳方式。
您可以使用SDwebImage,下载图像并将其保存在缓存中(以加快速度)并在本地保存图像。
另外,为了了解其他缓存apis,您可以查看此内容。我总是喜欢SDWebImage,因为它非常好而且快速。 link
希望这会对你有所帮助。快乐的编码:)