2

我有一个页面UITableView一次只显示一个项目。每个项目都是从互联网上获取的图片。我使用 block 异步下载图像:

- (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,只是调用这个函数把它放在我的缓存中。

4

2 回答 2

0

正如 Andrew Madsen 所说,self.currentIndex是一种方法调用。我的错误来自我更新的地方self.currentIndex

于 2013-03-14T22:22:42.723 回答
-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];
                 }];
}
于 2013-03-14T22:33:33.163 回答