1

そのコードを使用するときにイメージをロードするカスタム UITableViewcell を取得しました。

- (void)setImageWithURL:(NSURL *)URL
{
    dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(taskQ, ^{
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
        imageView.image = image;
        NSLog(@"test");
    });
}

イメージを非常に高速にロードするため、応答「テスト」を非常に高速に取得できますが、tableView にロードする必要があります。また、行を選択すると、画像が読み込まれます。

この問題を解決するにはどうすればよいですか?

ありがとう

4

2 に答える 2

2

setImageWithURL:がcellForRowAtIndexPathの効果として呼び出される限り、期待どおりに表示されるはずです...ただし、imageView.image=image;を呼び出す必要があります。メインスレッドで。これは、すべてのUI関連タスクに当てはまります。だからあなたは欲しいでしょう:

- (void)setImageWithURL:(NSURL *)URL
{
    dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(taskQ, ^{
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = image;
            NSLog(@"test");
        });
    });
}

編集:

NSOperationQueueを使用します。

ビューコントローラのメンバーとして操作キューを作成します。

    m_operationQueue = [NSOperationQueue new];
    m_operationQueue.maxConcurrentOperationCount = 1 // if you want to load images in order;

ビューがアンロードされ、テーブルが次を使用して更新されるときに、操作をキャンセルしてください。

    [m_operationQueue cancelAllOperations];

setImageWithURLであなたのことをしてください

- (void)setImageWithURL:(NSURL *)URL
{
    [m_operationQueue addOperationWithBlock:^{
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = image;
            NSLog(@"test");
        });
    }];
}

もう一度編集:

申し訳ありませんが、setImageがカスタムテーブルセルにあったことを忘れてしまいました。次のいずれかを実行できます。

1)+(void)initializeで初期化する静的オブジェクトにします。セルのメソッド2)ビューコントローラのクラスメソッドを介して静的オブジェクトを使用可能にする2)テーブルセルで使用可能なシングルトンインスタンスを作成する

デザインの好みはあなた次第であり、一貫性を保ちたい場合は、他にどのような方法を使用しているかによって異なります。

于 2012-10-05T18:56:59.500 に答える
0

イメージのダウンロードが終了したら、[tableViewreloadData]を呼び出す必要があります。

受け入れられた答えを持つ同様の質問がありますが、SDWebImageを使用することも提案されています。ご覧ください:UITableViewをスクロールせずにUITableViewCell画像をダウンロードした画像に更新する方法

于 2012-10-05T18:54:04.860 に答える