我有一个分页UITableView
一次只显示一个项目。每个项目都是从互联网上获取的图片。我使用块异步下载我的图像:
- (void)downloadImageForPost:(GifPost *)p atIndex:(NSInteger)index
{
[APIDownloader imageForSource:p.src
completion:^(NSData *data, NSError *error) {
if (self.currentIndex != index)
return;
[self.tableView
reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index
inSection:0]]
withRowAnimation:UITableViewRowAnimationNone];
}];
}
问题出在if (self.currentIndex != index)
,其中self.currentIndex
在块外修改。假设我为所有图像和self.currentIndex = 0
调用此函数。如果我滚动到另一个索引,因为self.currentIndex
在执行时被保存,我的if条件不起作用。
有没有办法阻止块复制指定的变量。如果没有,我该怎么做才能有正确的行为?
PS:我没有对data
做任何事情,只是调用此函数将其放入我的缓存中。
答案 0 :(得分:0)
正如Andrew Madsen所说,self.currentIndex
是方法调用。我的错误来自于我更新self.currentIndex
的地方。
答案 1 :(得分:-1)
您可能希望对self使用弱引用来阻止保留周期:
- (void)downloadImageForPost:(GifPost *)p atIndex:(NSInteger)index
{
__weak ClassForSelf *weakSelf = self;
[APIDownloader imageForSource:p.src
completion:^(NSData *data, NSError *error) {
if (weakSelf.currentIndex != index)
return;
[weakSelf.tableView
reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index
inSection:0]]
withRowAnimation:UITableViewRowAnimationNone];
}];
}