iOS GCD知識點總結

weixin_34279579發表於2018-01-07

引入

GCD(Grand Central Dispatch)是蘋果從OS X Snow Leopard 和 iOS4 開始引入的一套多執行緒開發的API,它是基於C語言的實現,其執行效率對比其他的多執行緒實現方式更高。其介面的呼叫很簡潔,使用起來十分方便。用蘋果爸爸的話來說,那就是:

開發者要做的只是定義想執行的任務並追加到適當的Dispatch Queue

既然有這麼好的東西在這裡,為什麼不好好地去使用它呢?

梳理點

  1. 多執行緒把原本順序執行的程式變成了多個流程來執行,各個流程之間的切換會有效能消耗,但在GCD的時候,永遠不用關注這些底層的事情。


    2792700-76bf3e1cc0350426.jpg

    2792700-0e0c9e56ee466d50.jpg
  1. 蘋果爸爸說的那句話是追加,並不是執行,所以在需要考慮執行效率的地方使用GCD介面,一定要記住是追加,追加後並不一定是立刻就執行!!!

  2. 在iOS6以後的版本,不用考慮dispatch_release()dispatch_retain()的呼叫時機,系統以及將其交給ARC來處理。

  3. Dispatch Queue分為兩類,序列佇列和並行佇列,都是按照追加順序執行,但一個序列佇列總在一個執行緒中執行,會有等待,並行佇列會發起多執行緒併發執行,沒有等待。


    2792700-9607cf173551e964.jpg
  1. Dispatch Queue可以通過dispatch_queue_create來建立,也可以從系統中來獲取,系統提供了兩類佇列:Main Dispatch Queue 和 Global Dispatch Queue,其中Main Dispatch Queue是序列佇列,Global Dispatch Queue是並行佇列,同時提供四個執行等級。

  2. 建立多個序列佇列來操作同一個資源,會有資料競爭問題,用一個並行佇列來操作,不會造成多執行緒安全問題,並且多個並行佇列也不會。

  3. dispatch_sync指定一個序列佇列,會造成死鎖。

  4. dispatch_apply會有阻塞執行緒問題,必須規定次數的block執行完,才走之後的程式碼。

  5. dispatch_walltime可用來建立絕對時間dispatch_time_t,相比dispatch_time建立的相對時間,絕對時間可用來做定時器。dispatch_time_t可用於dispatch_delaydispatch_group_wait函式。

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t milestone;
    
    interval = [date timeIntervalSince1970];
    subsecond = modf(interval, &second);
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    milestone = dispatch_walltime(&time, 0);
    
    return milestone;
}

Some Special Ways

  1. 使用dispatch_once來執行只需執行一次的執行緒安全程式碼

  2. 不要使用dispatch_get_current_queue,然而已經廢棄了,所以就別用了

  3. 可以用Dispatch Queue取代同步鎖,這樣可以提高效率

  4. 少用performSelect,很多借口都可以通過GCD實現

NSOperationQueue是GCD的高層封裝,提供了和GCD相同的功能,雖然在效能上不如GCD,但在一些功能的實現上使用NSOperationQueue會更加簡便,在使用的時候可以仔細斟酌二者的區別,來覺得采用那種API。

使用NSOperationQueue的優點:

  1. 可以取消某個NSOperation,但必須在其啟動之前,通過這隻標誌位的方式,GCD則不能對單獨的一個block取消。

  2. 可以指定依賴關係,使一個操作必須依賴於其他操作。

  3. 可以給NSOperation設定KVO監聽,檢查每個NSOperation的執行狀態。

  4. 可以指定每個NSOperation的優先順序,NSOperationQueue的優先順序也可以指定;GCD只有佇列的優先順序可以改變,而且是通過指定到系統的佇列的方式。

  5. 可以建立NSOperation的子類,定製一些功能。

參考資料:

Objective-C高階程式設計

Effective Objective-C 2.0

Apple Developer Document

iOS 多執行緒程式設計gcd全面系統認識

相關文章