先明確幾個概念吧!異步
&3.2 同步與異步async
串行與並行針對的是隊列,而同步與異步,針對的則是線程。post
最大的區別在於,同步線程要阻塞當前線程,必需要等待同步線程中的任務執行完,返回之後,才能繼續執行下一任務;而異步線程則是不用等待。spa
&3.3 GCD API線程
GCD API不少,這裏僅介紹本文用到的。blog
系統標準提供的兩個隊列隊列
// 全局隊列,一個特殊的並行隊列dispatch_get_global_queue// 主隊列,在主線程中運行,由於主線程只有一個,因此這是一個特殊的串行隊列dispatch_get_main_queue複製代碼get
除此以外,還能夠本身生成隊列同步
// 從DISPATCH_QUEUE_SERIAL看出,這是串行隊列dispatch_queue_create("com.demo.serialQueue", DISPATCH_QUEUE_SERIAL)// 同理,這是一個並行隊列dispatch_queue_create("com.demo.concurrentQueue", DISPATCH_QUEUE_CONCURRENT)複製代碼queue
同步與異步線程的建立:
dispatch_sync(..., ^(block))// 同步線程dispatch_async(..., ^(block))// 異步線程
案例與分析
案例一: 當同步遇到了串行
NSLog(@"1"); // 任務1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");// 任務2
});
NSLog(@"3"); // 任務3
摘自 http://www.javashuo.com/article/p-tpmdjgpy-bs.html
小結
簡單來講就是,在串行隊列裏添加同步線程(任務),線程中有(task1),task2
敲黑板了!
同步任務會阻塞當前線程而且將任務task1添加到隊列(串行)中.
此時隊列中的順序是: 同步線程 task2 task1
此時就出現了,先有的蛋仍是先有的雞的問題!