2016-11-23 15 views
11

當你需要在網絡任務或操作,完成塊執行主線程上一些東西,這些途徑獲得這將是最合適的,爲什麼?:OperationQueue.main VS DispatchQueue.main

  • OperationQueue.main.addOperation
  • DispatchQueue.main.async
+0

檢查這個鏈接 - http://stackoverflow.com/questions/7651551/why-should-i-choose-gcd-over-nsoperation-and-blocks-for - 高級應用程序/ 7654476#7654476和http://stackoverflow.com/questions/10373331/nsoperation-vs-grand-central-dispatch – Rajat

回答

4

DispatchQueue管理的工作項目的執行。提交給隊列的每個工作項都在由系統管理的線程池上處理。

參考:Apple Doc

的NSOperationQueue類規定了一組操作對象的執行。在添加到隊列後,操作將保留在該隊列中,直到它被明確取消或完成其任務。隊列中的操作(但尚未執行)本身根據優先級和操作間對象依賴性進行組織,並相應執行。應用程序可能會創建多個操作隊列並將操作提交給它們中的任何一個。

參考:Apple Doc

所以,你應該更喜歡DispatchQueue.main.async時要執行從任何網絡電話會議結束塊主線程的東西。特別是當它與UI Updates相關!如果你的任務很複雜,我的意思是如果你需要在運行任務上進一步操作,那麼你可以用OperationQueue.main.addOperation,否則DispatchQueue.main.async會給出比較優化的性能!

+0

這並不回答他們應該選擇哪個隊列的問題。 – MrMage

+0

@MrMage是的,編輯答案一點點! – Lion

8

有關這兩種隊列之間差異的詳細信息,請參閱Lion的答案。

這兩種方法都行得通。但是,當需要更高級的調度(包括依賴關係,取消等)時,主要需要NSOperation。所以在這種情況下,一個簡單的

DispatchQueue.main.async { /* do work */ } 

將會很好。這將相當於

dispatch_async(dispatch_get_main_queue(), ^{ /* do work */ }); 
在Objective-C,這也是我怎麼會幹這種語言

+1

@Lion:我不同意你選擇用反編碼格式化所有強調的單詞作爲代碼。請考慮使用下劃線來替代_italic_。 – MrMage

6

當使用的NSOperation

NSOperation API是偉大的封裝的功能定義良好的塊。例如,您可以使用NSOperation子類來封裝應用程序的登錄序列。

依賴管理是蛋糕上的錦上添花。一個操作可以依賴於其他操作,這是Grand Central Dispatch缺乏的強大功能。如果您需要以特定順序執行多項任務,那麼操作是一個很好的解決方案。

如果您要在短時間內創建幾十個操作,則可能會出現操作失策。由於NSOperation API固有的開銷,這可能導致性能問題。

當使用大中央調度

Grand Central Dispatch是理想的,如果你只需要一個代碼塊派遣到串行或並行隊列。

如果您不想爲繁瑣的任務創建NSOperation subclass的麻煩,那麼Grand Central Dispatch是一個很好的選擇。 Grand Central Dispatch的另一個好處是您可以將相關的代碼放在一起。看看下面的例子。

let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
// Process Response 
... 

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    // Update User Interface 
    ... 
}) 
}) 

在數據任務的完成處理程序,我們處理響應和通過調度閉合(或塊)在主隊列更新用戶界面。這是必要的,因爲我們不知道完成處理程序在哪個線程上執行,它很可能是後臺線程。

this source逐字引用

相關問題