19

由於我們有三個選項GCD,NSThreadNSOperationQueue,iOS中多線程的最佳方式是什麼?我很困惑哪一個是最好的?如果沒有,那麼應該在什麼情況下使用哪些,以及它們有何不同,以及如果有人使用NSOperationQueue的一些很好的例子,請分享,以便我可以學習。哪一個是GCD,NSThread或NSOperationQueue中最好的?

+1

定義「最佳」。最快,最輕,最容易使用? – CodaFi

+0

這是一個無法回答的問題,除非你有一個特定的用例。三者中沒有通用的「最好」。 – jrturton

回答

35

答案很簡單:

  1. 使用NSThread(甚至並行線程API),當你想要或需要有對你創建,例如線程直接控制您需要對線程優先級進行細粒度控制,或者與一些直接發佈/消耗線程對象的其他子系統進行交互,並且您需要與其保持同一頁面。這種情況很少見,但確實發生,特別是在實時應用中。

  2. 當您的任務適合於簡單的並行化時使用GCD,例如,你只是想通過很少的額外工作就可以將一些工作「投入到後臺」,你有一些數據結構,你只是希望序列化訪問(並且串行隊列非常適合以無鎖方式進行訪問),但你有一些循環可以很好地利用dispatch_apply()進行並行化,你有一些數據源/定時器,GCD的源API可以讓你在後臺輕鬆處理等等.GCD功能非常強大,你可以使用它很多不止這些,但是這些都是相對的'沒有腦子'的情況,你不想陷入初始化和設置任務,而只是簡單地「平行地做基本的東西」。

  3. 當你已經在Cocoa API層(vs直寫C到POSIX API)時使用NSOperation並且有更復雜的操作要並行化。 NSOperation允許子類化,任意複雜的依賴關係圖,取消和支持許多其他可能對您有用的高級語義。 NSOperation實際上在封面下使用GCD,所以它與GCD一樣具有多核心,多線程的能力,儘管它也爲基礎框架帶來了基礎框架,所以如果你在黑客入侵POSIX層,你可能想要使用選項#2。

正如其他人說,然而,這一切都取決於你試圖這樣做,沒有單一的,甚至普遍正確的回答你的問題。

+1

KUdos,... @ jkh ......這就是我想知道的。現在,有一些人與我在一起討論。好的,所以你說了關於點2,我目前正在使用2.但是,我想如果可以在運行時基於其他線程或隊列所花費的時間來設置線程的優先級。假設一個線程的時間超過3分鐘,我想降低它的優先級並增加第二個的優先級。 – Sumitiscreative

+0

另外,因爲我們在ios中有dispatch_global隊列,它們本質上是併發的。當我們將代碼塊分配給它然後,這比創建一個新的自定義併發隊列並將塊添加到它好嗎?或其相同?我們可以設置我們創建的這些隊列的優先級嗎? – Sumitiscreative

+2

在設置線程的優先級之前,首先要問的是「爲什麼?「我引用實時應用程序(例如音頻,視頻處理)作爲這樣做的主要原因,因爲它很少需要這樣做,否則GCD在全球併發隊列中提供4級優先級(背景,低,中,高),對於應用程序的需求幾乎總是足夠的如果一個線程需要3分鐘才能完成,設置優先級將無濟於事 - 或者將其分解爲更小的任務,或者讓操作系統爲長時間運行的線程動態設置優先級, (和它會) – jkh

0

最近我一直傾向於NSOperationQueue。這在內部使用GCD並且是線程安全的,並且使用起來非常簡單。

+0

但有人可能會認爲,擺脫NSOperationQueue肯定會更快,並且簡單地下降到GCD級別。 – CodaFi

+0

NSOperationQueue在任務離散,同步和活在同一線程中時(例如,它們或多或少是原子的),在幾乎任何情況下都可以用作基本線程池,因此它的工作效率最高。 –

相關問題