2.GCD一

1.簡(jiǎn)介

1.定義:Grand Central Dispatch 是異步執(zhí)行任務(wù)的技術(shù)之一。

將線程管理的代碼在系統(tǒng)級(jí)實(shí)現(xiàn)。我們只需要定義任務(wù)并追加到適當(dāng)?shù)腄Ispath Queue中,GCD就能生成必要的線程并按計(jì)劃執(zhí)行任務(wù)。

2.相比于NSThread的優(yōu)勢(shì):

  • 相比于NSThread的performSelector方法簡(jiǎn)潔
  • 不必對(duì)線程進(jìn)行管理, 通過GCD提供的系統(tǒng)級(jí)線程管理提高了執(zhí)行效率。
2.Dispatch Queue

1.Dispatch Queue 是執(zhí)行處理的等待隊(duì)列。

2.Dispatch Queue是隊(duì)列,按照追加的順序(先進(jìn)先出FIFO)執(zhí)行處理。

3.在執(zhí)行處理時(shí),存在2中Dispatch Queue。

  • 串行隊(duì)列: 將任務(wù)添加到串行隊(duì)列中,下一個(gè)任務(wù)會(huì)在上一個(gè)任務(wù)執(zhí)行完后再開始執(zhí)行。系統(tǒng)對(duì)一個(gè)串行隊(duì)列只生成一個(gè)線程。

  • 并發(fā)隊(duì)列:添加到并發(fā)隊(duì)列中的任務(wù),會(huì)有多個(gè)任務(wù)同時(shí)在執(zhí)行。系統(tǒng)會(huì)根據(jù)當(dāng)前轉(zhuǎn)態(tài),生成多個(gè)線程。

3.隊(duì)列的生成和獲取

1.通過GCD來(lái)生成Dispatch Queue

//創(chuàng)建串行隊(duì)列
dispatch_queue_t serialQueue = dispatch_queue_create("com.weixiao.mySerialQueue",NULL);

//創(chuàng)建并發(fā)隊(duì)列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.weixiao.myConcreteQueue", DISPATCH_QUEUE_CONCURRENT);
  • 第一個(gè)參數(shù)表示隊(duì)列的名稱。

  • 第二個(gè)參數(shù)為null表示創(chuàng)建的是串行隊(duì)列,DISPATCH_QUEUE_CONCURRENT表示并發(fā)隊(duì)列。

  • 當(dāng)創(chuàng)建很多個(gè)串行隊(duì)列的時(shí)候,每個(gè)隊(duì)列對(duì)應(yīng)一個(gè)線程會(huì)造成內(nèi)存消耗過大,引起大量的上下文切換,大幅度降低系統(tǒng)的響應(yīng)性能。

2.獲取系統(tǒng)提供的Dispatch Queue

// Main Queue
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();

//Global Queue 
dispatch_queue_t defaultGlobalDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  • 主隊(duì)列是串行隊(duì)列。追加到主隊(duì)中任務(wù)在主線程的Runloop中執(zhí)行。

  • global 隊(duì)列有4個(gè)執(zhí)行優(yōu)先級(jí)(high,default,low,background)。XNU內(nèi)核管理將global隊(duì)列的優(yōu)先級(jí)作為global隊(duì)列使用的的線程的優(yōu)先級(jí)。

4.dispatch_async和dispatch_sync

1.將任務(wù)添加到隊(duì)列有兩種函數(shù):

// 同步函數(shù)
dispatch_sync(queue,^{NSLog(@"black");});

//異步函數(shù)
dispatch_async(queue,^{NSLog(@"black");});
  • 同步函數(shù)會(huì)等待添加到隊(duì)列中的任務(wù)執(zhí)行完畢才返回, 會(huì)阻塞當(dāng)前線程。

  • 異步函數(shù)不會(huì)等待添加到隊(duì)列中的任務(wù)執(zhí)行完畢,它會(huì)立即返回,不會(huì)阻塞當(dāng)前線程。

2.當(dāng)同步和異步函數(shù),串行和并發(fā)隊(duì)列組合,串行隊(duì)列情況:

// 1 serial, sync   打印1234
serialQueue.sync {
  print(1)
}
print(2)
serialQueue.sync {
  print(3)
}
print(4)

//2 serial, async  打印24  打印13    24 和13之間情況不定
serialQueue.async {
  print(1)
}
print(2)
serialQueue.async {
  print(3)
}
print(4)

//3 serial, sync in async  打印1 打印2   死鎖。
print(1)
serialQueue.async {
  print(2)
  serialQueue.sync {
    print(3)
  }
  print(4)
}
print(5)

//4  serial, async in sync // 打印1  打印24  打印5    3在2后,位置不定。
print(1)
serialQueue.sync {
  print(2)
  serialQueue.async {
    print(3)
  }
  print(4)
}
print(5)

并發(fā)隊(duì)列情況如下:

//1 concurrent, sync     打印1234
concurrentQueue.sync {
  print(1)
}
print(2)
concurrentQueue.sync {
  print(3)
}
print(4)

//2 concurrent, async   打印24    1和3 情況不定。
concurrentQueue.async {
  print(1)
}
print(2)
concurrentQueue.async {
  print(3)
}
print(4)

//3 concurrent, sync in async  打印15   打印234    234在1后,情況不定。
print(1)
concurrentQueue.async {
  print(2)
  concurrentQueue.sync {
    print(3)
  }
  print(4)
}
print(5)


//4 concurrent, async in sync   打印1  打印24  打印5  3在2后情況不定。
print(1)
concurrentQueue.sync {
  print(2)
  concurrentQueue.async {
    print(3)
  }
  print(4)
}
print(5)

  • 會(huì)發(fā)生死鎖的情況是: 串行隊(duì)列中兩個(gè)任務(wù)相互等待。即在串行隊(duì)列A中,又將任務(wù)同步的添加到A。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容