2012-04-15 12 views
0

画像をUITableViewに非同期(GCD)で読み込んでいて、セルが複数の画像をシャッターして1つの画像に収まるという奇妙な動作が見られます。言葉で表現するのは難しいので、私はスクリーン・レコーディングを行いました。そこでは、特定のセルでは、複数のイメージが1つに収まる前にシフトします。UITableView複数の画像を使った非同期画像ロードシャッター

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

Iは(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をトリガ、テーブルの上に、すなわちユーザーフリックアップ)短時間で複数回呼び出さなっているという事実は、かどうか、私の懸念を引き起こしすべての非同期スレッドは、それらが想定していた場所に安全に「着陸」します。私が見ている動作(ビデオ中)は、私がここで間違っていることを確認しているようです。私はあなたが持っているかもしれない詳細や広範なアプローチ提案に感謝します。

ありがとうございました!

答えて

2

あなたは細胞の再利用を適切に実装していないようですね。 [tableView dequeueReusableCellWithIdentifier:blah]経由でセルを再利用する場合は、新しいイメージが完全にダウンロードされて表示されるまで、セルイメージをnilに設定してください。

また、セルを再使用する場合、以前のセルロードのイメージが遅くなることを防ぐために、そのイメージの潜在的に実行中の要求をキャンセルして、実際のものを上書きします。

+0

ありがとうございました!私は 'cell.imageView.image = nil;'を追加した直後に新しい/再利用するセルを取得し、それを修正しました! – Steven

+0

うれしい私はあなたを助けることができます。 –

+0

イメージをループでダウンロードしないようにするにはどうすればよいですか? – mikezang

関連する問題