将缩略图下载到UITableViewCell

时间:2013-08-31 01:26:44

标签: iphone ios uitableview nsoperationqueue

我有一个UITableView用缩略图填充其单元格。在我的例子中,缩略图是从服务器下载的。我的代码如下:

if (![self thumbnailExists])
{
    self.thumbnailImageView.image = nil;
    [self.activityIndicatorView startAnimating];

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:
    ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.thumbnailURL]];
        UIImage *image = [UIImage imageWithData:data];


        [[NSOperationQueue mainQueue] addOperationWithBlock:
         ^{
             SubmenuScrollViewTableViewCell *submenuScrollViewTableViewCell = (SubmenuScrollViewTableViewCell*)[(UITableView*)self.superview cellForRowAtIndexPath:self.indexPath];
             [submenuScrollViewTableViewCell.activityIndicatorView stopAnimating];
             submenuScrollViewTableViewCell.thumbnailImageView.image = image;
         }];
    }];

    [self.operationQueue addOperation:operation];
    [self.operationQueues setObject:operation forKey:[self title]];
}

此代码基于伟大的WWDC2012演示:“在iOS上构建并发用户界面”。我的代码和演示文稿中的代码之间的主要区别在于我使用从Web检索的数据填充我的单元格。

它在大多数情况下运行良好,但我遇到的问题是如果我滚动得非常快,那么其中一个单元格可能会显示错误的缩略图(通常我注意到所说的单元格将是单元格的倍数缩略图所属的)。我应该提一下,此代码正在被覆盖的layoutSubviews的{​​{1}}方法中执行。

有人能发现此代码中的任何缺陷吗?

2 个答案:

答案 0 :(得分:1)

你的代码破解的原因是这行代码:

 SubmenuScrollViewTableViewCell *submenuScrollViewTableViewCell = (SubmenuScrollViewTableViewCell*)[(UITableView*)self.superview cellForRowAtIndexPath:self.indexPath];

当调用此单元时,您正在抓取索引路径上的单元格,并在重用单元格时将其放置在此索引路径的任何单元格中。当视图移动得非常快时,这会将不同的图像放在不同的单元格中,并且服务器的响应可能会在不同的时间进入。

确保取消prepareForReuse中的操作并清除单元格图像,使其不会将图像放在错误的单元格中,或者图像不会被重复使用。

此外,从单元格本身调用tableView通常是不好的做法。

答案 1 :(得分:0)

问题与上述代码在我创建的子类UITableViewCell的layoutSubviews方法中的事实有关。当我在cellForRowAtIndexPath方法中将其移回时,问题就消除了。