1. 程式人生 > >iOS開發之NSThread、NSOperation、GCD三者之間的簡略比較

iOS開發之NSThread、NSOperation、GCD三者之間的簡略比較

1、首先NSThread、NSOperation、GCD這三種方式的發展歷程是由早到晚的,因此後者相比較前者而言更加簡單易用,即GCD為當前蘋果較為推薦的一種方式。

2、NSThread在控制執行緒優先順序方面只能通過“執行緒休眠sleepForTimeInterval來控制”,且並不精確,依賴於網路狀況,並且程式碼量稍複雜,並且想要傳多個引數的時候需要自定義物件

3、NSOperation有一個“執行緒池”的概念,通過兩種方式“NSInvocationOperation”、“NSBlockOperation”進行建立和操作,可以設定最大併發執行緒數、在優先順序控制方面做得很好,利用設定“依賴關係”即可滿足,並且可以傳遞多個引數。

   NSOperation是對GCD面向物件的ObjC封裝,但是相比GCD基於C語言開發,效率卻更高,建議如果任務之間有依賴關係或者想要監聽任務完成狀態的情況下優先選擇NSOperation否則使用GCD

4、對於多核運算更加有效,GCD中也有一個類似於NSOperationQueue的佇列,GCD統一管理整個佇列中的任務。但是GCD中的佇列分為並行佇列和序列佇列兩類:

     序列佇列:只有一個執行緒,加入到佇列中的操作按新增順序依次執行。

     並行佇列:有多個執行緒,操作進來之後它會將這些佇列安排在可用的處理器上,同時保證先進來的任務優先處理。

其實在GCD中還有一個特殊佇列就是主佇列,用來執行主執行緒上的操作任務(從前面的演示中可以看到其實在NSOperation中也有一個主佇列)

GCD總結:

1在GDC中一個操作是多執行緒執行還是單執行緒執行取決於當前佇列型別和執行方法,只有佇列型別為並行佇列並且使用非同步方法執行時才能在多個執行緒中執行。

2、行佇列可以按順序執行,並行佇列的非同步方法無法確定執行順序

3UI介面的更新最好採用同步方法,其他操作採用非同步方法

5、原子屬性(atomic)和非原子屬性(nonatomic)的區別:

       nonatomic屬性讀取的是記憶體資料(暫存器計算好的結果)

       atomic就保證直接讀取暫存器的資料

       在應用多執行緒的時候有的變數需要設定為atomic屬性,因為這樣可以保證不會出現一個執行緒正在修改資料,而另一個執行緒讀取了修改之前(儲存在記憶體中)的資料,永遠保證同時只有一個執行緒在訪問一個屬性。

6、解決執行緒同步問題(比如春運購票):兩種方法:一種是使用NSLock同步鎖,另一種是使用@synchronized程式碼塊,相比使用NSLock,@synchronized更加簡單,推薦使用後者

//加鎖
    [_lock lock];
    if (_imageNames.count>0) {
        name=[_imageNames lastObject];
        [_imageNames removeObject:name];
    }
    //使用完解鎖
    [_lock unlock];
//執行緒同步
    @synchronized(self){
        if (_imageNames.count>0) {
            name=[_imageNames lastObject];
            [NSThread sleepForTimeInterval:0.001f];
            [_imageNames removeObject:name];
        }
    }

       以上觀點均為個人簡單粗略總結,如有錯誤還請指教