0

我有一个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 的精彩演示:“Building Concurrent User Interfaces on iOS”。我的代码与演示文稿中的代码之间的主要区别在于,我正在使用从 Web 检索到的数据填充我的单元格。

它在大多数情况下都很好用,但我遇到的问题是,如果我滚动得非常快,那么其中一个单元格可能会显示错误的缩略图(通常我注意到所说的单元格将是其中的单元格的倍数缩略图属于)。我应该提到这段代码是在layoutSubviews重写的方法中执行的UITableViewCell

任何人都可以发现此代码中的任何缺陷吗?

4

2 回答 2

1

您的代码中断的原因是因为这行代码:

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

调用此方法时,您将在索引路径处抓取单元格,并在重复使用该单元格时将其放置在此索引路径处的任何单元格中。当视图移动非常快并且可能来自服务器的响应在不同时间到达时,这会将不同的图像放在不同的单元格中。

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

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

于 2013-08-31T01:47:44.127 回答
0

该问题与上述代码位于我创建的子类 UITableViewCell 的 layoutSubviews 方法中的事实有关。当我将它移回 cellForRowAtIndexPath 方法时,问题就解决了。

于 2013-09-03T00:32:53.713 回答