1.推出的時間 iOS4 目的是用來取代NSThread(iOS2推出)的,是C語言框架,它能夠自動利用更多CPU的核數,并且會自動管理線程的生命周期。
GCD的兩個核心概念:任務、隊列
任務:即為在block中執行的代碼。
隊列:用來存放任務的。
注意事項:隊列!=線程。隊列中的存放的任務最后都要由線程來執行!。隊列的原則:先進先出,后進后出(FIFO)
2.隊列又分為四種:1.串行隊列2.并發隊列3.主隊列4.全局隊列
串行隊列:任務一個接一個的執行。
并發隊列:隊列中的任務并發執行。
主隊列:跟主線程相關的隊列,主隊列里面的內容都會在主線程中執行(我們一般都是在主線程中刷新UI)
全局隊列:一個特殊的并發隊列
3.并發隊列和全局隊列的區別:
并發隊列有名稱,可以跟蹤錯誤。全局隊列沒有
在ARC中兩個隊列不需要考慮釋放內存,但是在MRC中并發隊列是創建出來的,需要release操作,而全局隊列只有一個不需要。
一般開發過程中我們使用全局隊列
>1.執行任務的兩個函數
~“同步”執行任務:dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
~"異步"執行任務:dispatch——async(dispatch_queue_t queue, <#^(void)block#>)
>2."同步"和“異步”的區別:
~“同步”只能在“當前”線程中執行任務,不具備開啟新線程的能力。
~“異步”可以在“新”的線程中執行任務,具備開啟新線程的能力。
>3.各個隊列的執行效果:
*串行隊列同步執行,即在當前線程中順序執行
*串行隊列異步執行,開辟一條新的線程,在該線程中順序執行
*并行隊列同步執行,不開辟線程,在當前線程中順序執行
*并行隊列異步執行,開辟多個新的線程,丙炔線程會重用,無序執行
*主隊列異步執行,不開辟新的形成,順序執行
*主隊列同步執行,會造成死鎖(“主線程”和“主隊列”相互等待,卡住主線程)
4.線程間的通訊:經典案例:子線程進行耗時操作(例如下載更新)主線程進行UI刷新
dispatch_async(dispatch_get_global_queue(0, 0), ^{??
// 執行耗時的異步操作
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主線程,執行UI刷新操作
~1.延時操作:
調用NSObject方法:[self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再調?self的run?法
GCD函數實現延時執?:dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 2秒后執?這?的代碼... 在哪個線程執?,跟隊列類型有關
隊列組的使用:
項目需求:首先:分別異步執行兩個耗時操作;其次:等兩次耗時操作都執行完畢后,再回到主線程執行操作:使用隊列組(dispatch_group_t)快速高效的實現上述需求:
dispatch_group_t group = dispatch_group_create(); // 隊列組
dispatch_queue_t queue = dispatch_get_global_queue(0, 0); // 全局并發隊列
dispatch_group_async(group, queue, ^{// 異步執?操作1?
?// longTime1?
?});?
?dispatch_group_async(group, queue, ^{ // 異步執?操作2 ?
// longTime2?
?});?
?dispatch_group_notify(group, dispatch_get_main_queue(), ^{
? // 在主線程刷新數據?
// reload Data?
});