iOS開發之多執行緒技術(NSThread、OperationQueue、GCD)

青玉伏案發表於2015-12-21

  在前面的部落格中如果用到了非同步請求的話,也是用到的第三方的東西,沒有正兒八經的用過iOS中多執行緒的東西。其實多執行緒的東西還是蠻重要的,如果對於之前學過作業系統的小夥伴來說,理解多執行緒的東西還是比較容易的,今天就做一個小的demo來詳細的瞭解一下iOS中的多執行緒的東西。可能下面的東西會比較枯燥,但還是比較實用的。

多執行緒用的還是比較多的,廢話少說了,下面的兩張截圖是今天我們實驗的最終結果,應該是比較全的,小夥伴們由圖來分析具體的功能吧:

功能說明:

1、點選同步請求圖片,觀察整個UI介面的變化,並點選測試按鈕,紅色是否會變成綠色。

2、NSThread按鈕,是由NSThread方式建立執行緒並執行相應的操作。

3、Block操作按鈕是用Block建立操作,並在操作佇列中執行,下面的是Invocation操作

4、serial是GCD中的序列佇列,concurrent是GCD中的並行佇列

好啦,上面的鹹蛋先到這兒,程式碼該走起啦。

  一、準備階段

1.不管使用程式碼寫,還是storyboard或者xib等,先把上面所需的控制元件初始化好以便使用

2.點選測試UI按鈕,改變下邊label的顏色的程式碼如下:

 

3.從網路上獲取圖片,並使用主執行緒顯示程式呼叫情況

 

 

4.上面的用到了主執行緒來呼叫updateTextViewWithString方法,因為只有主執行緒才能更新UI,updateTextViewWithString:這個方法負責把執行緒的執行資訊顯示在View上,程式碼如下:

 

5.把請求完的圖片載入到ImageView上

 

6.載入圖片的,也就是請求資料後在ImageView上顯示

 

  二、通過各種方式來

1.同步請求圖片測試,請求資料和更新UI都放在主執行緒中順序執行,這樣在請求資料的時候UI會卡死,程式碼如下;

 

2.NSThread建立執行緒測試,用detachNewThreadSelector方法來建立新的執行緒會自動啟動並執行,而不用呼叫start方法。程式碼如下:

 

3.NSInvocationOperation的使用,新建一個呼叫操作,然後新增到佇列中執行,程式碼如下:

 

 

4.block的操作,新建一個block操作,並新增到佇列中執行,程式碼如下:

 

 

5.GCD中的序列佇列:

 

 

6.GCD中的並行佇列:

 

以上是各個按鈕對應的方法,下面的截圖是執行結果:

 

  三、執行緒間的同步問題(為我們的執行緒新增上同步鎖)

在作業系統中講多執行緒時有一個名詞叫髒資料,就是多個執行緒操作同一塊資源造成的,下面就修改一下程式碼,讓資料出現問題,然後用同步鎖來解決這個問題

1.在getImageData方法(標題一中的第3個方法)中有兩條語句。這個用來顯示執行緒的標號。上面的標號是沒有重複的。

在兩條語句中間加一個延遲,如下:

如果執行的話,會有好多標號是重複的,如圖一,__count是成員變數,多個執行緒對此他進行操作,所以會出現標號不一致的情況,下面我們加上同步鎖

(1)用NSLock加同步鎖,程式碼如下:

(2)通過@synchronized加同步鎖,程式碼如下:

加鎖前後的執行效果如下:

GCD的序列佇列開始執行的順序如下,下面是是在一個執行緒中按FIFO的順序執行的:

GCD中的並行佇列,是在不同的執行緒中同時執行的:

 

今天部落格中的內容還是蠻多的,如果之前接觸過Java的多執行緒的東西,或者其他語言中的多執行緒的話,理解起來應該問題不大。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

iOS開發之多執行緒技術(NSThread、OperationQueue、GCD)

相關文章