2011-12-11 34 views
0

iPhoneの「公式」のようなフォトギャラリーを作成しています。 ALAsset(中央の1つ、左と右の1つ前のALAsset)から3つのUIImageViewsをロードし、サムネイルをロードしてからfullScreenImageをロードし、そのサムネイルを置き換えます。UIscrollviewでの写真の遅延読み込み

すべてがバックグラウンドで発生し、シリアルキューにはdispatch_asyncが含まれています。

私の問題は、ユーザーが写真をすばやくスクロールするときです。サムネイルのUIimageviewsを返さなければならない関数のように、以前の写真のfullScreenImageバージョンを読み込んでいる間にサムネイルを読み込もうとします。 ..戻りません、遅れが発生します。

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

答えて

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); 

、あなたは(dispatch_asyncどんな仕事を)myImageQueueにその作業のためのターゲット・キューが同時高い優先度でターゲットを変更されていますので、あなたがmyThumbnailQueueに提出するすべての作業よりも低い優先順位のものであろうキュー。デフォルトでは、新しいシリアル・キューのターゲット・キューは「通常の」優先度のグローバル・コンカレント・キューであるため、作成後にmyImageQueueに何もする必要はありません。

+0

こんにちは、あなたのお返事ありがとうございます。私は既にさまざまな優先順位で試してみましたが、成功しませんでした。完全な写真の読み込みに低い優先度を割り当てても、サムネイル(高優先度)の新しい要求がエンキューされると、前のものが既に開始されているとブロックされていないようです。たぶん、ALAssetからのローディングには、強力なディスクアクティビティが含まれているのでしょうか?優先順位は、CPUの激しい作業には有効ですが、メモリからのロードは優先順位付けによって助けられません... – flip79

+0

ブロックが既に実行されていると、それを先取りする方法がないため、優先度の高いキューの作業の中断優先度の低い作業の進行中 - キューの優先度は、次に実行される保留中の「作業」を決定するだけです。サムネイルのレンダリングの進行中にイメージのレンダリングを「バックオフ」にする内部フラグを設定すると、イメージレンダリングの作業を少しでも中断する必要があるようです。数百ミリ秒か何かのために寝ることによって。効率的ではありませんが、すべてのコードをリファクタリングするのに時間がかかります。 – jkh

関連する問題