標籤:應用 應用程式 優先 數字 日誌 枚舉類 串列 本質 枚舉
同步,非同步,串列,並發
同步和非同步代表會不會開闢新的線程。串列和並發代表任務執行的方式。
同步串列和同步並發,任務執行的方式是一樣的。沒有區別,因為沒有開闢新的線程,所有的任務都是在一條線程裡面執行。
非同步串列和非同步並發,任務執行的方式是有區別的,非同步串列會開闢一條新的線程,隊列中所有任務按照添加的順序一個一個執行,非同步並發會開闢多條線程,至於具體開闢多少條線程,是由系統決定的,但是所有的任務好像就是同時執行的一樣。
開闢隊列的方法:
dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", NULL);
/**
參數1:標籤,用於區分隊列
參數2:隊列的類型,表示這個隊列是串列隊列還是並發隊列NUll表示串列隊列,
DISPATCH_QUEUE_CONCURRENT表示並發隊列
*/
執行隊列的方法
非同步執行
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
同步執行
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
主隊列
主隊列:專門負責調度主線程度的任務,沒有辦法開闢新的線程。所以,在主隊列下的任務不管是非同步任務還是同步任務都不會開闢線程,任務只會在主線程順序執行。
主隊列非同步任務:現將任務放在主隊列中,但是不是馬上執行,等到主隊列中的其它所有除我們使用代碼添加到主隊列的任務的任務都執行完畢之後才會執行我們使用代碼添加的任務。
主隊列同步任務:容易阻塞主線程,所以不要這樣寫。原因:我們自己代碼任務需要馬上執行,但是主線程正在執行代碼任務的方法體,因此代碼任務就必須等待,而主線程又在等待代碼任務的完成好去完成下面的任務,因此就形成了相互等待。整個主線程就被阻塞了。
全域隊列
全域隊列:本質是一個並發隊列,由系統提供,方便編程,可以不用建立就直接使用。
擷取全域隊列的方法:dispatch_get_global_queue(long indentifier.unsigned long flags)
/**
參數說明:
參數1:代表該任務的優先順序,預設寫0就行,不要使用系統提供的枚舉類型,因為ios7和ios8的枚舉數值不一樣,使用數字可以通用。
參數2:蘋果保留關鍵字,一般也寫0
*/
全域隊列和並發隊列的區別:
1,全域隊列沒有名字,但是並發隊列有名字。有名字可以便於查看系統日誌
2,全域隊列是所有應用程式共用的。
3,在mrc的時候,全域隊列不用手動釋放,但是並發隊列需要。
IOS 主隊列,全域隊列的關係