上一篇文章我對GCD的幾個基本概念做了介紹,但是大家看完了可能覺得對理解GCD並沒有什麼卵用。其實會用GCD其實很簡單,只要記住兩條就可以了。 1. 主隊列里的任務必須在非同步函數中執行。 主隊列里的任務如果在同步函數中執行,就會造成死鎖。什麼是死鎖?容我舉例來說明。 看到沒有,主隊列里的任務沒有執行 ...
上一篇文章我對GCD的幾個基本概念做了介紹,但是大家看完了可能覺得對理解GCD並沒有什麼卵用。其實會用GCD其實很簡單,只要記住兩條就可以了。
1. 主隊列里的任務必須在非同步函數中執行。
主隊列里的任務如果在同步函數中執行,就會造成死鎖。什麼是死鎖?容我舉例來說明。
看到沒有,主隊列里的任務沒有執行,程式也沒有往下執行,這就叫做死鎖。那又為什麼會發生死鎖。主隊列里的任務預設都在主線程中執行,程式都把主隊列里的任務放在主線程的最後面。當程式執行到2時,會把任務1放在主線程的後面,等主線程里的任務都執行完了在執行。可是這是什麼函數啊?這是同步函數啊,它會堵塞當前的線程,後面的任務會等任務1執行完再執行。所以他們又開始互相等待,永遠不會往下執行了。
任務1對其他任務說:你們快執行啊?你們執行完我才能執行!
其他任務對任務1說:不行啊,你執行完我們才能執行。這是同步那個二貨規定的。
任務1和其他任務就開始了漫長的等待……
2. 全局併發隊列里的任務在非同步函數中執行才能實現併發。
我們發現程式創建了三條線程,每條線程都執行下載圖片的任務,三張圖片幾乎是同時開始下載的。這就實現了併發,也沒有堵塞主線程。最重要的一點,下載完的圖片,一定要在主線程更新。
如果有興趣可以試試把併發隊列里的任務放在同步函數中執行,我們就會發現三張圖片的下載都是在主線程中進行的,圖片好長時間才下載完。因為圖片是一個一個下載的,而不像上面是同時開始下載。
至於自定義隊列,我就不講了,因為和上面的原理差不多,而且用的地方也不多。併發隊列系統已經提供了,我們就不要自己創建了。至於串列隊列,我們運用多線程就是為了多任務同時進行,串列隊列里的任務無論在同步函數還是非同步函數中,都不可能同時進行。
關於GCD還有很多其他的用處,我會在下一篇文章中講。