五、线程管理————GCD
本文只對GCD的其他操作進行一些補充。
1、延遲操作
?? ?實例:
//延時操作
? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
? ? });
?
?? ??? ?/*
?? ??? ?dispatch_after的參數(shù)
參數(shù)1? dispatch_time_t when
多少納秒之后執(zhí)行
參數(shù)2? dispatch_queue_t queue
任務(wù)添加到那個隊列
參數(shù)3? dispatch_block_t block
要執(zhí)行的任務(wù)
?? ?*/
2、一次性執(zhí)行
(1)定義:程序運行中只執(zhí)行一次。一次性執(zhí)行是線程安全的,可以使用一次性執(zhí)行創(chuàng)建單例對象,效率比互斥鎖高。
(2)實現(xiàn):可以用來創(chuàng)建單例對象。
?? ?//原理:當onceToken為0時執(zhí)行方法,然后將全局變量oneceToken更改為-1,以后就無法再執(zhí)行。
?? ?static dispatch_once_t onceToken;
??? dispatch_once(&onceToken, ^{
?????? ?
?? ?//要執(zhí)行一次的代碼;
??? });
3、調(diào)度組
(1)定義:有時候需要在多個異步任務(wù)都執(zhí)行完成之后繼續(xù)做某些事情,比如下載歌曲,等所有的歌曲都下載完畢之后轉(zhuǎn)到主線程提示用戶,這樣需要一個順序的統(tǒng)一調(diào)度。
(2)實現(xiàn):
//1 全局隊列
? ? dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
? ? //2 調(diào)度組
? ? dispatch_group_t group = dispatch_group_create();
? ? //3 添加任務(wù)
? ? //把任務(wù)添加到隊列,等任務(wù)執(zhí)行完成之后通知調(diào)度組,任務(wù)是異步執(zhí)行
? ? dispatch_group_async(group, queue, ^{
? ? ? ? NSLog(@"歌曲1下載完畢? %@",[NSThread currentThread]);
? ? });
? ? dispatch_group_async(group, queue, ^{
? ? ? ? NSLog(@"歌曲2下載完畢? %@",[NSThread currentThread]);
? ? });
? ? dispatch_group_async(group, queue, ^{
? ? ? ? NSLog(@"歌曲3下載完畢? %@",[NSThread currentThread]);
? ? });
? ? //4 所有任務(wù)都執(zhí)行完成后,獲得通知 (異步執(zhí)行)
? ? //等調(diào)度組中隊列的任務(wù)完成后,把block添加到指定的隊列
? ? dispatch_group_notify(group, queue, ^{
? ? ? ? NSLog(@“所有歌曲都已經(jīng)下載完畢! ? %@",[NSThread currentThread]);
? ? });
?
? ? dispatch_group_notify(group, dispatch_get_main_queue(), ^{
?? ??? ?//在主線程,更新UI控件,提示用戶
? ? ? ? NSLog(@“播放器更新完畢!? %@",[NSThread currentThread]);
? ? });
? ? NSLog(@"over");
(3)原理:
?//1 全局隊列
? ? dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
?
? ? //2 調(diào)度組
? ? dispatch_group_t group = dispatch_group_create();
?
? ? //ARC中不用寫
//? ? dispatch_retain(group);
? ? //3 進入調(diào)度組,執(zhí)行此函數(shù)后,再添加的異步執(zhí)行的block都會被group監(jiān)聽
? ? dispatch_group_enter(group);
?? ?
? ? //4 添加任務(wù)一
? ? dispatch_async(queue, ^{
? ? ? ? NSLog(@“下載第一首歌曲!”);
? ? ? ? dispatch_group_leave(group);
? ? ? ? //ARC中此行不用寫,也不能寫
//? ? ? ? dispatch_release(group);
? ? });
? ? //5 添加任務(wù)二
? ? dispatch_group_enter(group);
? ? dispatch_async(queue, ^{
? ? ? ? NSLog(@“下載第二首歌曲”);
? ? ? ? dispatch_group_leave(group);
? ? ? ? //ARC中此行不用寫,也不能寫
? ? ? ? //dispatch_release(group);
? ? });
?? ?
? ? //6? 獲得調(diào)度組的通知
? ? dispatch_group_notify(group, dispatch_get_main_queue(), ^{
? ? ? ? NSLog(@“歌曲都已經(jīng)下載完畢! %@",[NSThread currentThread]);
? ? });
//7 等待調(diào)度組 監(jiān)聽的隊列中的所有任務(wù)全部執(zhí)行完畢,才會執(zhí)行后續(xù)代碼,會阻塞線程(很少使用)
? ? dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
轉(zhuǎn)載于:https://www.cnblogs.com/David-SU/p/5274386.html
總結(jié)
以上是生活随笔為你收集整理的五、线程管理————GCD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DES加密解密与AES加密解密
- 下一篇: iOS中Block的基础用法