2013-09-30 75 views
0

我看過DISPATCH_QUEUE_SERIAL是一個FIFO隊列,只能運行在一個處理器內核上。如何使用DISPATCH_QUEUE_CONCURRENT和障礙塊複製FIFO隊列?

我的應用程序從磁盤提取圖像,應用效果,創建一個UIImage並將圖像添加到數組。數組中的順序必須與我從磁盤讀取圖像的順序相同。

當我使用DISPATCH_QUEUE_SERIAL訂單保持。

但是什麼是使用DISPATCH_QUEUE_CONCURRENT的設計模式,所以圖像在所有內核上都得到了處理,但是一旦處理完成,它們將按照FIFO的順序添加到數組中?

文檔賽斯:

在併發執行塊A調度隊列。儘管它們同時執行塊,但您可以使用屏障塊在隊列中創建同步點。

是否有阻擋塊創建FIFO隊列併發處理的例子?

+0

跟蹤他們應該在陣列中應該使用的索引是不夠的嗎?然後無論他們完成加載的順序,他們都會按照該索引進行。 – micantox

+0

是的,我也這麼想過。但我希望有一個GCD設計模式來解決這個問題。 – openfrog

回答

2

最簡單的GCD的方法,我能想到的會是這樣的:

NSArray* arrayOfImages = <your array of images to be processed>; 
NSMutableArray* processedImages = [arrayOfImages mutableCopy]; 
dispatch_queue_t protectMutableArray = dispatch_queue_create("", 0); 
dispatch_apply(arrayOfImages.count, dispatch_get_global_queue(0, 0), ^(size_t index) { 
    UIImage* unprocessedImage = arrayOfImages[index]; 
    UIImage* processedImage = ProcessImage(unprocessedImage); 
    dispatch_sync(protectMutableArray, ^{ 
     [processedImages replaceObjectAtIndex: index withObject: processedImage]; 
    }); 
}); 

dispatch_apply回報,processedImages將包含所有處理過的圖像與它們的順序保存,但處理將在並行下完成的。此處還要注意,到串行隊列的dispatch_sync僅用於序列化processedImages的突變,並且與排序無關。