0

UITableView に画像を非同期 (GCD) で読み込んでいますが、セルが 1 つに落ち着く前に複数の画像を「シャッター」するという奇妙な動作が見られます。言葉で説明するのは難しいので、スクリーン レコーディングを作成しました。特定のセルについて、1 つのセルに落ち着く前に複数の画像が移動することがわかります。

http://www.youtube.com/watch?v=PKuqng81QX4

キューを使用して (REST エンドポイントから) 画像をフェッチしてから、メイン キューを使用してセルに画像を設定しています。コード スニペットは次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

// ..after getting the cell:

    dispatch_queue_t imageQ = dispatch_queue_create("imageQ", NULL);
    dispatch_async(imageQ, ^{
        NSString *galleryTinyImageUrl = someFunctionToGetThumbnailUrl;
        NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:galleryTinyImageUrl]];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.imageView.image = [UIImage imageWithData:imageData];
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
        });
    });
    dispatch_release(imageQ);

これが短時間に複数回呼び出されるという事実 (つまり、ユーザーがテーブルを上にフリックすると、これらのセル イメージのロードが 30 回トリガーされて起動されます) は、すべての非同期スレッドがどこに安全に「着陸」するかという懸念を引き起こします。するはずです。私が見ている動作 (ビデオ) は、私がここで何か間違ったことをしていることを検証しているようです. あなたが持っているかもしれない詳細または幅広いアプローチの提案をいただければ幸いです。

助けてくれてありがとう!

4

1 に答える 1

2

セルの再利用を適切に実装していないようです。新しい画像が完全にダウンロードされ、表示する準備ができるまで[tableView dequeueReusableCellWithIdentifier:blah]、セルの画像を に設定してセルを再利用する場合は、必ず確認してください。nil

また、セルを再利用する場合は、そのイメージに対して実行中の可能性のあるリクエストをキャンセルして、以前のセルのイメージの読み込みが遅くなり、実際のイメージが上書きされるのを防ぎます。

于 2012-04-15T18:50:36.560 に答える