2013-01-09 55 views
1

我有一種方法可以用不同的數據重複執行數學運算(可能有數百萬次)。在iOs中執行此操作的最佳方式是什麼(它將在iPad設備上運行)?我知道performSelectorOnBackgroundThread已被棄用...?我還需要將所有結果彙總爲NSArray。最好的方法似乎是:將通知發佈到通知中心並將該方法添加爲觀察者。它是否正確?該數組需要被聲明爲原子,我相信...另外,我將需要顯示一個進度條作爲操作完成...我可以同時啓動多少個線程?我不認爲首發1.000.000線程是上的iDevice一個好主意..提前大規模並行計算ios

謝謝...

+0

你確定你不希望有一個IFrontEnd到(無我)主要電腦大規模並行矢量能力? –

+0

您是否已經測試過這種天真的方法(在主線程中按順序運行它)並進行測試,看看需要多長時間(如果有,多長時間)?做任何計算都取決於其他計算的結果嗎? – Kitsune

+0

到目前爲止,所有的測試都是在模擬器上完成的......這要快得多......計算不依賴於所有其他計算的任何結果......它們是獨立的 – user1028028

回答

4

看爲Grand Central Dispatch,這是做iOS上的多線程(首選方式和Mac)。

使用GCD看起來像一個簡單的例子:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 
    //do long running task here 
} 

這將異步執行主線程塊。 GCD具有的調度任務,一是直接從上面列出的維基百科文章採取了許多其他的方法是:

dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){ 
    results[i] = do_work(data, i); 
    }); 
total = summarize(results, count); 

這種特殊的代碼示例可能是你在尋找什麼,假設這「大任務」的你是一個embarrassingly parallel

+0

它是令人尷尬的並行...(這是一個蒙特卡羅算法) – user1028028

2

雖然您可以使用dispatch_apply()並同時分離所有運行,但最終會變得更慢。

您將希望能夠在同時計算的同時節流飛行中的運行數量,這是您需要調整的。

我經常使用一個dispatch_semaphore_t來簡化對飛行中計算的調整。這樣做的

細節在這裏回答:https://stackoverflow.com/a/4535110/25646