0

GCD で画像を読み込んでいますが、奇妙な動作が発生しました。

テーブル ビューをスクロールすると、すべてのアルバムがアートワークの取得を開始します。はNSTableCellViewすぐに多くの間違ったアートワークを表示し、おそらく 1 秒後に最終的に正しいアートワークを表示して停止します。

明らかにこれは、ディスパッチ後、の変数がNSTableCellView同じインスタンスを指していないことを意味し、同じセルの画像が何度も何度も変更されます。

ディスパッチ ブロックを呼び出してこれを修正しようとしviewAtColumn:row:indexOfObject:ましたが、問題は修正されません。

助言がありますか?


コード

- (ITAlbumTableCellView *)makeTableCellViewWithAlbum:(ITLibAlbum *)album {
    ITAlbumTableCellView *cellView = (ITAlbumTableCellView *)[self makeTableCellViewWithIdentifier:kTCVIAlbum];

    // ... Mapping Stuff

    // Set artwork
    if (![self._imageCache objectForKey:album]) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSImage *artwork = album.artwork;
            if (!artwork || !artwork.isValid) artwork = [NSImage imageNamed:@"noArtwork"];

            [self._imageCache setObject:artwork forKey:album];

            dispatch_async(dispatch_get_main_queue(), ^{
                NSTableCellView *tcv = [self.tableView viewAtColumn:0 row:[self.tableContent indexOfObject:album] makeIfNecessary:NO];
                tcv.imageView.image = artwork;
            });
        });
    } else {
        cellView.imageView.image = [self._imageCache objectForKey:album];
    }

    return cellView;
}
4

1 に答える 1

1

再利用可能なセルを使用するため、セルが境界の外に隠れると、別のデータを表示するために再利用されます。クイックフィックス:

 - (ITAlbumTableCellView *)makeTableCellViewWithAlbum:(ITLibAlbum *)album {
ITAlbumTableCellView *cellView = (ITAlbumTableCellView *)[self makeTableCellViewWithIdentifier:kTCVIAlbum];
static int tag = 0;
tag++;
int tagForBlock = tag;
cellView.tag = tag;
if (![self._imageCache objectForKey:album]) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSImage *artwork = album.artwork;
        if (!artwork || !artwork.isValid) artwork = [NSImage imageNamed:@"noArtwork"];

        [self._imageCache setObject:artwork forKey:album];

        dispatch_async(dispatch_get_main_queue(), ^{
            if(tagForBlock != cellView.tag)
                return;
            NSTableCellView *tcv = [self.tableView viewAtColumn:0 row:[self.tableContent indexOfObject:album] makeIfNecessary:NO];
            tcv.imageView.image = artwork;
        });
    });
} else {
    cellView.imageView.image = [self._imageCache objectForKey:album];
}

return cellView;
}
于 2013-09-09T13:23:14.907 に答える