2011-12-11 76 views
0

我正在寫一個像iPhone上的「官方」的照片庫。它從ALAsset中加載3個UIImageViews(中間的一個,上一個和下一個左側和右側),加載縮略圖,然後加載fullScreenImage,替換其縮略圖。延遲加載的照片在UIscrollview

一切都發生在後臺,dispatch_async在串行隊列中。

我的問題是用戶快速滾動照片時:應用程序嘗試加載縮略圖,同時它仍然加載先前照片的fullScreenImage版本,所以應該返回縮略圖的UIimageviews的功能。 ..不返回,併發生滯後。

我無法取消已在dispatch_async上運行的任務,以便爲加載縮略圖的功能給予最大優先級,所以我該如何解決此問題?

回答

0

這是內置併發隊列的4個(最初3個)不同優先級旨在解決的一種情況。具體來說,說你能做:

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

嗨jkh,非常感謝你的回答。我已經嘗試了不同的優先次序,但沒有成功。即使我爲加載完整照片指定了較低的優先級,但當新的縮略圖(高優先級)請求排入隊列時,如果前一個請求已經啓動,它似乎不會被阻止。也許是因爲強大的磁盤活動,來自ALAsset的加載涉及...?看起來優先級可以用於強烈的CPU任務,但是從內存加載並不會受到優先級排序的幫助... – flip79

+0

塊一旦執行完畢,就沒有辦法搶佔它,所以你不會看到一個場景,優先級隊列工作正在中斷正在進行的低優先級工作 - 隊列的優先級僅確定下一個正在執行哪個未決的「工作」。在我看來,您需要將圖像渲染工作稍微分開一些,或者設置一個內部標誌,使得在縮略圖渲染過程中圖像渲染「退後」。睡幾百毫秒或什麼的。效率不高,但很少重構所有代碼,這可能會奏效! – jkh