NSOperation vs. Grand Central Dispatch (GCD)
在Mac OS X v10.6和iOS4之前,NSOperation 與 NSOperationQueue 不同於GCD,他們使用了完全不同的機制。
從Mac OS X v10.6和iOS4開始,NSOperation 和 NSOperationQueue是建立在GCD上的。作為一種通例,蘋果推薦使用最高級別的抽象,然而當評估顯示有需要時,會突然降到更低級別。
以下是對兩者的快速比較,它會幫助你決定何時何地去使用GCD或者NSOperation和NSOperationQueue;
NSOperation API
NSOperation 類有一個相當簡短的聲明。要定制一個操作,可以遵循以下步驟:
為了你能夠測試代碼,請新建一個類,繼承自NSOperation,寫成如下的形式:
之後再進行操作:
注意,只有將一個任務添加進了隊列當中,這個任務才會被執行.
以下代碼是並發執行2個任務,隊列的最大並發數是4:
任務具有的優先級:
當你添加了操作到一個隊列時,在對操作調用“start”方法之前,NSOperationQueue會浏覽所有的操作。那些有較高優先級的操作會被先執行。有同等優先級的操作會按照添加到隊列中的順序去執行(先進先出)。
(歷史注釋:在1997年,火星車中的嵌入式系統遭遇過優先級反轉問題,也許這是說明正確處理優先級和互斥鎖的最昂貴示例了。想對這一事件的背景知識有更多的了解,可以看這個網址:http://research.microsoft.com/en-us/um/people/mbj/Mars_Pathfinder/Mars_Pathfinder.html)
請添加如下的延遲方法:
先開始任務,1s鐘之後cancel掉一個任務:
每個任務結束後都會有一個回調可以表示任務結束:
任務之間的從屬關系:
以下來點總結:
NSOperationQueue API
查看當前並發操作的所有任務:
掛起與恢復操作:
This method suspends or resumes the execution of operations. Suspending a queue prevents that queue from starting additional operations. In other words, operations that are in the queue (or added to the queue later) and are not yet executing are prevented from starting until the queue is resumed. Suspending a queue does not stop operations that are already running.
這個方法會掛起或者恢復一個執行的任務.掛起一個隊列可以阻止該隊列中沒有開始的任務.換句話說,在任務隊列中還沒有開始執行的任務是會被掛起的,直到這個掛起操作被恢復.掛起一個隊列不會讓一個已經執行的任務停止哦,親.
取消所有操作:
要取消一個隊列中的所有操作,你只要簡單的調用“cancelAllOperations”方法即可。還記得之前提醒過經常檢查NSOperation中的isCancelled屬性嗎?
原因是“cancelAllOperations”並沒有做太多的工作,他只是對隊列中的每一個操作調用“cancel”方法 — 這並沒有起很大作用!:] 如果一個操作並沒有開始,然後你對它調用“cancel”方法,操作會被取消,並從隊列中移除。然而,如果一個操作已經在執行了,這就要由單獨的操作去識 別撤銷(通過檢查isCancelled屬性)然後停止它所做的工作。
簡單的block形式的隊列任務:
以上就基本上講完了怎麼使用NSOperation以及NSOperationQueue了,親.