同步,異步,串行,併發ios
同步和異步表明會不會開闢新的線程。串行和並發表明任務執行的方式。編程
同步串行和同步併發,任務執行的方式是同樣的。沒有區別,由於沒有開闢新的線程,全部的任務都是在一條線程裏面執行。併發
異步串行和異步併發,任務執行的方式是有區別的,異步串行會開闢一條新的線程,隊列中全部任務按照添加的順序一個一個執行,異步併發會開闢多條線程,至於具體開闢多少條線程,是由系統決定的,可是全部的任務好像就是同時執行的同樣。異步
開闢隊列的方法:async
dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", NULL);spa
/**線程
參數1:標籤,用於區分隊列日誌
參數2:隊列的類型,表示這個隊列是串行隊列仍是併發隊列NUll表示串行隊列,隊列
DISPATCH_QUEUE_CONCURRENT表示併發隊列get
*/
執行隊列的方法
異步執行
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的時候,全局隊列不用手動釋放,可是併發隊列須要。