0

iPhoneの「公式」のようなフォトギャラリーを書いています。ALAsset から 3 つの UIImageViews (中央に 1 つ、左右に前と次の 1 つ) を読み込み、サムネイルを読み込み、次に fullScreenImage を読み込み、そのサムネイルを置き換えます。

すべてがバックグラウンドで発生し、シリアル キューの dispatch_async が使用されます。

私の問題は、ユーザーが写真をすばやくスクロールするときです。アプリは、前の写真の fullScreenImage バージョンをまだ読み込んでいる間にサムネイルを読み込もうとするため、サムネイルの UIimageviews を返す関数は... しません。 t 戻り、ラグが発生します。

サムネイルをロードする関数に最大の優先順位を与えるために、dispatch_async で既に実行されているタスクをキャンセルすることはできません。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

これは、組み込みの同時キューの 4 つ (最初は 3 つ) の異なる優先度レベルが対処することを意図したシナリオの 1 つです。具体的には、次のようにします。

dispatch_queue_t high, myImageQueue, myThumbnailQueue;

high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0L);
myImageQueue = dispatch_queue_create("task.imageQ", NULL);
myThumbnailQueue = dispatch_queue_create("task.thumbQ", NULL);
dispatch_set_target_queue(myThumbnailQueue, high);

これで、myImageQueue に dispatch_async() する作業は、myThumbnailQueue に送信する作業よりも優先度が低くなります。これは、その作業のターゲット キューが高優先度の同時キューで再ターゲットされているためです。デフォルトでは、新しいシリアル キューのターゲット キューは「通常の」優先度のグローバル同時キューであるため、作成後に myImageQueue に対して何もする必要はありません。

于 2011-12-12T03:15:36.837 に答える