0

画像をテーブルに読み込もうとしていますが、まだちらつきがあります。画像を読み込んでいますが、スクロールすると、次のサムネイル画像が読み込まれる前に短いちらつきがあります。はい、アップルには例とさまざまなフレームワークがあることを知っていますが、これは非常に単純なコードであり、次の画像が読み込まれる前にちらつきます。他のすべては正常に動作します。ありがとう!

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

static NSString *CellIdentifier = @"customCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil){
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil];

    for (id currentObject in topLevelObjects) {
        if ([currentObject isKindOfClass:[CustomCell class]]) {
            cell = (CustomCell *)currentObject;
            break;
        }
    }
}

NSString *myUrl = [[items objectAtIndex:indexPath.row] objectForKey:@"myUrl"];

NSURL *url = [NSURL URLWithString:url];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^{
    UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];
    dispatch_sync(dispatch_get_main_queue(), ^{
        [[cell imageView] setImage:image];
        [cell setNeedsLayout];
    });
});

return cell;
}
4

2 に答える 2

1

の再利用メカニズムを使用していUITableViewます。つまり、dequeueReusableCellWithIdentifierすでに画像セットがあるセルを取得できます。そのため、最初に で画像を削除する必要があります[[cell imageView] setImage:nil]。次に、dispatch ブロック内で、セルがまだ画面上にあることを確認できません。インデックス パスがまだ同じかどうかを確認する必要があります。そうしないと、画像を間違ったセルに設定してしまいます。

dispatch_async(queue, ^{
    UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];
    dispatch_sync(dispatch_get_main_queue(), ^{
        if ([[tableView indexPathForCell:cell] compare:indexPath] == NSOrderedSame) {
            [[cell imageView] setImage:image];
            [cell setNeedsLayout];
        }
// alternative:    
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        if (cell)
            cell.imageView.image = image;
    });
});

NSOperationを使用する代わりに、サブクラスを使用してリモート画像をロードすることをお勧めしますdataWithContentsOfURL。セルがオフスクリーンになったときに画像のロードをキャンセルすることもできます。パフォーマンスを向上させるために、画像キャッシュの使用も検討してください。

于 2012-08-27T23:58:07.977 に答える
0

画像が既に読み込まれているかどうかを確認する必要がある同様の問題がありました。現在のコードは画像を読み込むだけですが、セルに既に画像がある場合はどうでしょうか? ユーザーがテーブルをスクロールするたびにこのタスクを実行する必要はありません。

私が尋ねた私の質問をチェックしてください。

テーブル ビューの非同期スクロール

于 2012-08-27T23:38:49.100 に答える