2

UITableView一度に1つのアイテムのみを表示するページがあります。各アイテムはインターネットから取得した写真です。ブロックを使用して非同期で画像をダウンロードします:

- (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 に答える