同步,異步,串行,並發
同步和異步代表會不會開辟新的線程。串行和並發代表任務執行的方式。
同步串行和同步並發,任務執行的方式是一樣的。沒有區別,因為沒有開辟新的線程,所有的任務都是在一條線程里面執行。
異步串行和異步並發,任務執行的方式是有區別的,異步串行會開辟一條新的線程,隊列中所有任務按照添加的順序一個一個執行,異步並發會開辟多條線程,至於具體開辟多少條線程,是由系統決定的,但是所有的任務好像就是同時執行的一樣。
開辟隊列的方法:
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的時候,全局隊列不用手動釋放,但是並發隊列需要。