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