0

我正在尝试将图像加载到表格中,但我仍然在闪烁。正在加载图像,但在滚动时会在下一个缩略图图像加载之前短暂闪烁。是的,知道 Apple 有一个示例和各种框架,但这是非常简单的代码,只是在加载下一个图像之前该死的闪烁。其他一切正常。谢谢!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"customCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil){
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil];

    for (id currentObject in topLevelObjects) {
        if ([currentObject isKindOfClass:[CustomCell class]]) {
            cell = (CustomCell *)currentObject;
            break;
        }
    }
}

NSString *myUrl = [[items objectAtIndex:indexPath.row] objectForKey:@"myUrl"];

NSURL *url = [NSURL URLWithString:url];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^{
    UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];
    dispatch_sync(dispatch_get_main_queue(), ^{
        [[cell imageView] setImage:image];
        [cell setNeedsLayout];
    });
});

return cell;
}
4

2 回答 2

1

您正在使用UITableView. 这意味着您可以获得一个dequeueReusableCellWithIdentifier已经有图像集的单元格。所以首先你需要用[[cell imageView] setImage:nil]. 然后在调度块内,您无法确定单元格是否仍在屏幕上。您需要检查索引路径是否仍然相同,否则您会将图像设置为错误的单元格:

dispatch_async(queue, ^{
    UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];
    dispatch_sync(dispatch_get_main_queue(), ^{
        if ([[tableView indexPathForCell:cell] compare:indexPath] == NSOrderedSame) {
            [[cell imageView] setImage:image];
            [cell setNeedsLayout];
        }
// alternative:    
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        if (cell)
            cell.imageView.image = image;
    });
});

我建议使用NSOperation子类来加载远程图像而不是使用dataWithContentsOfURL- 然后您也可以在单元格离开屏幕时取消图像加载。还可以考虑使用图像缓存以获得更好的性能。

于 2012-08-27T23:58:07.977 回答
0

我有一个类似的问题,您需要检查图像是否已加载。您当前的代码只是加载图像,但是如果单元格已经有图像怎么办?您不希望每次用户滚动表格时都执行此任务。

看看我问的问题。

表视图滚动异步

于 2012-08-27T23:38:49.100 回答