-1

重複の可能性:
GCDの非同期ブロックを強制終了/一時停止/閉じるにはどうすればよいですか?

私は画像処理を行い、結果の画像を表示するアプリに取り組んでいます。UIScrollViewを使用して、ユーザーがすべての画像をスクロールできるようにします。画像は標準のjpgまたはpngではないため、読み込みに時間がかかります。メインキューへのディスパッチが終了したら、GCDを使用して非同期にロードして表示します。スニペットは次のとおりです。

- (void)loadImage:(NSString *)name
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIImage *image = [Reader loadImage:name];
        dispatch_sync(dispatch_get_main_queue(), ^{
            [self displayImage:image];
        });
    });
}

これはほとんどの場合うまく機能します。ただし、スクロール速度が速すぎて、最初に読み込まれた画像が表示される前にメソッドが数回呼び出される場合があります。停止すると、現在のimageViewに前の画像がすばやく表示され、最後に現在の画像が表示されます。これはメモリの問題のためにクラッシュしやすいです。

キューに新しいブロックがある場合(つまり、前のブロックが終了する前にメソッドが再度呼び出される場合)、前のブロックをキャンセルするようにキューに通知する方法があるのでしょうか?または他のより良い提案?

前もって感謝します。

4

1 に答える 1

1

クラスメソッドを使用して画像をロードしていますが、さまざまなスレッドから同時に(ブロックを介して)画像を呼び出すため、そのためにReaderを設計したことを願っています。いずれにせよ、私が提案するのは、可変セットを作成し、リーダーに画像をロードするようにメッセージを送るたびに、最初にセットに名前を追加することです。戻ったら、名前を削除しますが、メインスレッドで削除します(追加と削除の両方がmainQueueまたはメインスレッドで実行されます)。

ここで、1つまたはすべての画像の処理を停止する場合は、新しい「cancelLoad」メソッドをReaderに追加し、処理を停止する名前のリストを送信します。

于 2012-09-13T12:29:38.867 に答える