2013-10-19 98 views
1

我必須對大量文件執行復雜的操作。幸運的是,枚舉順序並不重要,並且可以在不鎖定的情況下並行完成作業。併發文件枚舉

是否該平臺提供了一種方式來做到這一點?由於缺乏更好的API,我在考慮:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    NSArray *paths = [[NSFileManager defaultManager] subpathsAtPath:folder]; 
    [paths enumerateObjectsWithOptions:NSEnumerationConcurrent 
    usingBlock:^(NSString *path, NSUInteger idx, BOOL *stop) { 
     // Complex operation 
    }]; 
}]; 

有沒有更好的方法?

+0

多數民衆贊成我如何寫它,也會好奇,知道是否有更好的方法。 –

+1

您要查找多少併發數。您的代碼將在後臺運行,但不會同時運行多個文件操作。你也不應該在後臺線程上使用'defaultManager'。 – Wain

+0

@Wain你能否闡述爲什麼(在答案中,也許)?我有興趣使用盡可能多的內核來並行處理文件。 – hpique

回答

1

您當前的代碼放在一個塊的全局隊列。所以,這個單塊將在後臺線程上運行,並執行所有的迭代和處理。

你想要做的東西有點不同有你的處理任務同時運行。您應該在主線程上進行迭代,並在循環的每次迭代中將全局隊列添加到全局隊列中。

更好,創建一個NSOperation子類。把你的邏輯放在那裏。在循環中創建一個操作的實例並將它們添加到操作隊列中。這是一個更高層次的API,併爲您提供選項添加依賴,剪裁最大併發,檢查操作的數目仍有待完成,等等。

1

這裏是你可以考慮的方法。如果你有(或可能有)成千上萬的文件,而不是枚舉enumerateObjectsWithOptions:usingBlock:,你可能想要批量手動枚舉數組(比方說每個100個元素)。當前批次完成執行時(您可以使用分派組檢查)開始下一批次。通過這種方法,您可以避免將數以萬計的塊添加到隊列中。

BTW我已經刪除了我以前的答案,因爲它是錯誤的。