天天看點

iOS多線程技術

ios多線程技術主要配置設定nsthread、nsoperation和gcd。下邊來簡單的介紹一下吧。

随性一點,就不按照順序來了。是以先介紹一下nsoperation。

------------------------------------------------------------------------------nsoperation------------------------------------------------------------------------------

nsblockoperation:

它是nsoperation的一個具體的子類,它管理着并發執行的一個或者多個塊操作。你可以使用這個對象一次執行多個連續的塊,而沒有必要去為每一個操作建立分開的操作對象。當執行超過一個block時,操作自己在所有塊執行完畢後結束。

nsinvocationoperation:

它是nsoperation的一個具體子類,它管理執行一個單獨的封裝的任務作為一個調用。你可以使用這個類開始一個調用指定對象的選擇器操作。這個類實作的是非并發操作。

nsoperationqueue:

該類控制一套nsoperation對象的執行。當把operation添加到隊列,它會一直存在在該隊列中,直到确信它取消或者結束執行它的任務。在queue(還沒有執行)中的operation都是自己組織執行根據優先級和互相作用對象依賴。一個application可能會建立多個操作隊列,然後執行他們其中的任何一個操作。

需要注意:nsoperationqueue為nsoperation配置設定不同的線程來執行。

iOS多線程技術
iOS多線程技術

上面是一個簡單的測試程式,我們可以看到在一個nsoperationqueue中添加了三個塊操作。然後執行結果如下:

第一次執行:

可見nsoperationqueue為nsblockoperation配置設定了不同的線程。而是是并發操作。也就是說nsoperation預設是并發執行的,要想串行執行很簡單,隻需要設定一下nsoperationqueue的一個屬性即可:

該屬性來控制nsoperationqueue的最大并發數量,當設定為1是就是串行執行了。

接下來看看下邊的代碼:

iOS多線程技術
iOS多線程技術

我沒有将nsblockoperation放到nsoperationqueue中,而是直接自己調用了start方法,此時會有什麼結果呢???????

看結果:

結果表明:當我直接去調用nsoperation的start方法時,此時所有的nsoperation都是在主線程上執行的。因為他們的線程位址一樣。而且是順序執行的。

此外,nsoperation還提供了cancel方法,不過這裡cancel隻能取消狀态為ready、finish的nsoperation,不能取消正在執行的操作。

再此外,nsoperation還提供了adddependency:方法。

adddependency方法的作用是使接收者一欄指定操作的完成。接收者不考慮去執行它自己直到所有它的依賴操作結束執行。如果接收者準備執行它的任務,添加依賴就沒有實際性的影響了。該方法可能改變接收者的isready和依賴屬性。舉個例子:

如上邊那句代碼,意思是operation3依賴于operation2的操作,如果operation2沒有執行,并且operation3還沒有準備執行它的任務,那麼他們的執行順序一定是operation2先執行,然後operation3後執行。

------------------------------------------------------nsblockoperation結束---------------------------------------------------------------------------------

nsinvocation

上邊已經介紹了這個類的大概作用,現在來看看它的使用:

iOS多線程技術
iOS多線程技術

執行結果如下:

操作對象預設在主線程中執行,這個和nsblockoperation一樣。如果是多個則是串行執行。如果我們沒有把它放在nsoperationqueue中,都是在主線程執行。

nsoperation總結:

nsblockoperation可以單獨的調用start執行,但是此時都是再主隊列中執行的。

nsblockoperatioin可以添加到nsoperationqueue中執行,此時都是建立的線程執行。可以通過cancel取消ready和執行完畢的線程和adddependency設定線程依賴。

-------------------------------------------------------------------------------------nsoperation結束-------------------------------------------------------------------------------------

nsthread

它是比nsoperation和gcd都要輕量級的線程。

它有兩種直接建立形式

也就是第一個種使用執行個體方法。initwithtawrget...那個。第二個是使用的類方法。

第一種建立的線程是先建立線程對象,然後在運作線程操作,需要手動調用start方法。

第二種是直接建立線程并且開始運作線程。

還有一種不顯式建立線程的方法:

就是使用nsobject的類方法。

---------------------------------------------------------------------------nsthread就這麼多吧---------------------------------------------------------------------------

現在來對比一下三者:

nsthread:

優點:比其他兩個輕量級、使用簡單

缺點,需要自己管理線程的生命周期、線程同步、加鎖、睡眠等。

nsoperation:

優點:不需要關心線程管理以及資料同步

nsoperation是面向對象的。

gcd:

ios4.0+才能使用,是替代nsthread/nsoperation的高效和強大的技術。

它是基于c語言的。

------------------------------------------------------------------先介紹這麼多吧------------------------------------------------------------------

adddependency

繼續閱讀