我有一个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}}方法中执行。
有人能发现此代码中的任何缺陷吗?
答案 0 :(得分:1)
你的代码破解的原因是这行代码:
SubmenuScrollViewTableViewCell *submenuScrollViewTableViewCell = (SubmenuScrollViewTableViewCell*)[(UITableView*)self.superview cellForRowAtIndexPath:self.indexPath];
当调用此单元时,您正在抓取索引路径上的单元格,并在重用单元格时将其放置在此索引路径的任何单元格中。当视图移动得非常快时,这会将不同的图像放在不同的单元格中,并且服务器的响应可能会在不同的时间进入。
确保取消prepareForReuse中的操作并清除单元格图像,使其不会将图像放在错误的单元格中,或者图像不会被重复使用。
此外,从单元格本身调用tableView通常是不好的做法。
答案 1 :(得分:0)
问题与上述代码在我创建的子类UITableViewCell的layoutSubviews方法中的事实有关。当我在cellForRowAtIndexPath方法中将其移回时,问题就消除了。