-
Managing Units of Work(管理工作單位)
調(diào)度塊允許您直接配置隊列中各個工作單元的屬性。它們還允許您處理個別工作單位,以等待其完成两波,并通知其完成和/或取消它們
-
dispatch_block_t
1.這是提交給dispatch隊列的塊的原型静浴,它不帶參數(shù),也沒有返回值渠概。
2.創(chuàng)建block的方式有兩種
-
2.1:dispatch_block_create
2.1.1
-
2.2:dispatch_block_create_with_qos_class
dispatch_block_t blockT=dispatch_block_create(0, ^{
NSLog(@"11111");
});
NSLog(@"22222");
dispatch_queue_t myQueue=dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myQueue, blockT);
NSLog(@"33333");
//第三個參數(shù)設(shè)置成1 居然在下面dispatch_async(myQueue, blockY);處奔潰,不知道是不是死鎖,暫不知原因
dispatch_block_t blockY=dispatch_block_create_with_qos_class(1, QOS_CLASS_USER_INTERACTIVE, 0, ^{
NSLog(@"44444");
});
dispatch_async(myQueue, blockY);
NSLog(@"5555");
參數(shù):
參數(shù)1:是一個dispatch_block_flags枚舉
DISPATCH_BLOCK_BARRIER
DISPATCH_BLOCK_DETACHED
DISPATCH_BLOCK_ASSIGN_CURRENT
DISPATCH_BLOCK_NO_QOS_CLASS
DISPATCH_BLOCK_INHERIT_QOS_CLASS
DISPATCH_BLOCK_ENFORCE_QOS_CLASS
并不太清楚具體原因
參數(shù)2.而 qos_class_t 是一種枚舉播揪,有以下類型:
QOS_CLASS_USER_INTERACTIVE: user interactive 等級表示任務(wù)需要被立即執(zhí)行贮喧,用來在響應(yīng)事件之后更新 UI,來提供好的用戶體驗猪狈。這個等級最好保持小規(guī)模箱沦。
QOS_CLASS_USER_INITIATED: user initiated 等級表示任務(wù)由 UI 發(fā)起異步執(zhí)行。適用場景是需要及時結(jié)果同時又可以繼續(xù)交互的時候雇庙。
QOS_CLASS_DEFAULT: default 默認(rèn)優(yōu)先級
QOS_CLASS_UTILITY: utility 等級表示需要長時間運行的任務(wù)谓形,伴有用戶可見進(jìn)度指示器。經(jīng)常會用來做計算疆前,I/O寒跳,網(wǎng)絡(luò),持續(xù)的數(shù)據(jù)填充等任務(wù)竹椒。這個任務(wù)節(jié)能童太。
QOS_CLASS_BACKGROUND: background 等級表示用戶不會察覺的任務(wù),使用它來處理預(yù)加載胸完,或者不需要用戶交互和對時間不敏感的任務(wù)书释。
QOS_CLASS_UNSPECIFIED: unspecified 未指明
參數(shù)3:
-
dispatch_function_t
1.提交調(diào)度隊列的函數(shù)原型
2.函數(shù)可以接受一個dispatch_function_t類型作為參數(shù),同時接受一個指向您提供上下文數(shù)據(jù)赊窥。調(diào)用調(diào)度函數(shù)時爆惧,將上下文數(shù)據(jù)的指針作為參數(shù)傳遞給函數(shù)。對上下文數(shù)據(jù)的指針未經(jīng)修改而傳遞給您的函數(shù)锨能,您有責(zé)任確保指針是有效的
-
dispatch_block_perform
1.從指定的塊和標(biāo)志創(chuàng)建扯再、同步執(zhí)行和釋放調(diào)度塊
2.在不需要對指定塊的堆或一個新塊對象的分配進(jìn)行復(fù)制的情況下,可以更有效地實現(xiàn)此功能
3.相當(dāng)于如下代碼
//調(diào)用
NSLog(@"11111");
dispatch_block_perform(0, ^{
NSLog(@"2222");
});
NSLog(@"3333");
//dispatch_block_perform相當(dāng)于如下
dispatch_block_t b = dispatch_block_create(flags, block);
b();
Block_release(b)
-
dispatch_block_wait
1.同步地等待址遇,直到執(zhí)行指定的調(diào)度塊已經(jīng)完成叔收,或者直到指定的超時已經(jīng)過去。
2.該函數(shù)會阻塞當(dāng)前線程進(jìn)行等待傲隶。傳入需要設(shè)置的 block 和等待時間 timeout 饺律。timeout 參數(shù)表示函數(shù)在等待 block 執(zhí)行完畢時,應(yīng)該等待多久跺株。如果執(zhí)行 block 所需的時間小于 timeout 复濒,則返回 0,否則返回非 0 值乒省。此參數(shù)也可以取常量DISPATCH_TIME_FOREVER 巧颈,這表示函數(shù)會一直等待 block 執(zhí)行完,而不會超時袖扛≡曳海可以使用 dispatch_time 函數(shù)和 DISPATCH_TIME_NOW 常量來方便的設(shè)置具體的超時時間十籍。
3.如果 block 執(zhí)行完成, dispatch_block_wait 就會立即返回唇礁。不能使用 dispatch_block_wait 來等待同一個 block 的多次執(zhí)行全部結(jié)束勾栗;這種情況可以考慮使用dispatch_group_wait 來解決。也不能在多個線程中盏筐,同時等待同一個 block 的結(jié)束围俘。同一個 block 只能執(zhí)行一次,被等待一次琢融。
4.注意:因為 dispatch_block_wait 會阻塞當(dāng)前線程界牡,所以不應(yīng)該放在主線程中調(diào)用
dispatch_queue_t concurrentQuene = dispatch_queue_create("concurrentQuene", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQuene, ^{
dispatch_queue_t allTasksQueue = dispatch_queue_create("allTasksQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_block_t block = dispatch_block_create(0, ^{
NSLog(@"開始執(zhí)行");
[NSThread sleepForTimeInterval:3];
NSLog(@"結(jié)束執(zhí)行");
});
dispatch_async(allTasksQueue, block);
// 等待時長,10s 之后超時
dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC));
long resutl = dispatch_block_wait(block, timeout);
if (resutl == 0) {
NSLog(@"執(zhí)行成功");
} else {
NSLog(@"執(zhí)行超時");
}
});
-
dispatch_block_notify
1.可理解為監(jiān)聽
2.在指定的調(diào)度塊執(zhí)行完成時漾抬,調(diào)度一個通知塊提交給隊列
3.該函數(shù)接收三個參數(shù)宿亡,第一個參數(shù)是需要監(jiān)視的 block,第二個參數(shù)是監(jiān)聽的 block 執(zhí)行結(jié)束之后要提交執(zhí)行的隊列 queue纳令,第三個參數(shù)是待加入到隊列中的 block她混。 和 dispatch_block_wait 的不同之處在于:dispatch_block_notify 函數(shù)不會阻塞當(dāng)前線程
-
dispatch_block_cancel
1.這個函數(shù)用異步的方式取消指定的 block
dispatch_queue_t myQueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
// 耗時任務(wù)
dispatch_block_t firstBlock = dispatch_block_create(0, ^{
NSLog(@"開始第一個任務(wù):%d",[NSThread isMainThread]);
[NSThread sleepForTimeInterval:1.5f];
NSLog(@"結(jié)束第一個任務(wù)");
});
// 耗時任務(wù)
dispatch_block_t secBlock = dispatch_block_create(0, ^{
NSLog(@"開始第二個任務(wù):%d",[NSThread isMainThread]);
[NSThread sleepForTimeInterval:2.f];
NSLog(@"結(jié)束第二個任務(wù)");
});
dispatch_async(myQueue, firstBlock);
dispatch_async(myQueue, secBlock);
// 等待 1s,讓第一個任務(wù)開始運行,因為myQueue是串行隊列泊碑,遵守fifo先進(jìn)先出的規(guī)則,所以必須先執(zhí)行完block1毯欣,才能執(zhí)行block2
[NSThread sleepForTimeInterval:1];
NSLog(@"休眠:%d",[NSThread isMainThread]);
dispatch_block_cancel(firstBlock);
NSLog(@"準(zhǔn)備取消第一個任務(wù)");
dispatch_block_cancel(secBlock);
NSLog(@"準(zhǔn)備取消第二個任務(wù)");
/*
打印的結(jié)果為:
2017-07-06 18:32:04.046 多線程-GCD[6427:205689] 開始第一個任務(wù):0
2017-07-06 18:32:05.047 多線程-GCD[6427:205642] 休眠:1
2017-07-06 18:32:05.047 多線程-GCD[6427:205642] 準(zhǔn)備取消第一個任務(wù)
2017-07-06 18:32:05.047 多線程-GCD[6427:205642] 準(zhǔn)備取消第二個任務(wù)
2017-07-06 18:32:05.547 多線程-GCD[6427:205689] 結(jié)束第一個任務(wù)
可見 dispatch_block_cancel 對已經(jīng)在執(zhí)行的任務(wù)不起作用馒过,只能取消尚未執(zhí)行的任務(wù)
*/
-
dispatch_block_testcancel
1.測試給定的調(diào)度塊是否已被取消
2.如果取消調(diào)度塊,則返回一個非零值酗钞,否則為零
-
Prioritizing Work and Specifying Quality of Service(優(yōu)先工作和指定服務(wù)質(zhì)量
)
-
Dispatch Queue Priorities
1.用于選擇適當(dāng)?shù)娜植l(fā)隊列(global concurrent queue)
1.1 DISPATCH_QUEUE_PRIORITY_HIGH:這個常數(shù)映射到 QOS_CLASS_USER_INITIATED類
發(fā)送到隊列的項目以高優(yōu)先級運行腹忽;隊列在任何默認(rèn)優(yōu)先級或低優(yōu)先級隊列之前調(diào)度執(zhí)行
1.2 DISPATCH_QUEUE_PRIORITY_DEFAULT:這個常數(shù)映射到 QOS_CLASS_DEFAULT類
發(fā)送到隊列的項目以默認(rèn)優(yōu)先級運行;隊列在所有高優(yōu)先級隊列已排定之后執(zhí)行調(diào)度砚作,但在調(diào)度任何低優(yōu)先級隊列之前
1.3 DISPATCH_QUEUE_PRIORITY_LOW:這個常數(shù)映射到 QOS_CLASS_UTILITY類
發(fā)送到隊列的項目以低優(yōu)先級運行窘奏;隊列在所有默認(rèn)優(yōu)先級和高優(yōu)先級隊列已排定之后執(zhí)行調(diào)度
1.4 DISPATCH_QUEUE_PRIORITY_BACKGROUND:這個常數(shù)映射到QOS_CLASS_BACKGROUND類
發(fā)送到隊列的項目以后臺優(yōu)先級運行;隊列在所有高優(yōu)先級隊列被調(diào)度后執(zhí)行調(diào)度葫录,系統(tǒng)在其優(yōu)先級為后臺狀態(tài)設(shè)置的線程上運行項目着裹。這樣一個線程的優(yōu)先級最低,任何磁盤I/O是節(jié)流米同,減少對系統(tǒng)的影響
2.在MacOS 10.10以后骇扇,利用QoS類代替。有關(guān)更多信息面粮,請參見服務(wù)質(zhì)量類(QoS)
-
dispatch_qos_class_t
-
dispatch_queue_priority_t
-
dispatch_queue_get_qos_class
-
dispatch_queue_attr_make_with_qos_class
如上這幾個少孝,官方文檔并沒有做過多介紹,了解就行
-
Using Dispatch Groups(利用調(diào)度組)
分組塊允許聚合同步熬苍。您的應(yīng)用程序可以提交多個塊稍走,并在它們?nèi)客瓿蓵r跟蹤它們,即使它們可能在不同的隊列上運行。當(dāng)所有指定的任務(wù)都完成后婿脸,你再需要做什么行為時粱胜,這種類是有幫助的
-
dispatch_group_t
1.提交一組塊對象給隊做為異步調(diào)用
2.調(diào)度組是監(jiān)視一組塊的機制。應(yīng)用程序可以根據(jù)需要同步或異步監(jiān)視組中的塊盖淡。通過擴展年柠,一個組可以用于對依賴于其他任務(wù)完成的代碼進(jìn)行同步。
注意褪迟,組中的塊可以在不同的隊列上運行冗恨,并且每個單獨的塊可以向組添加更多的塊
-
dispatch_group_async
1.將block(任務(wù))提交到指定的隊列中,并且將次任務(wù)放到(關(guān)聯(lián))指定的group,block將異步執(zhí)行
2.參數(shù)
group:要關(guān)聯(lián)的組。該組由系統(tǒng)保留味赃,直到該塊運行完成為止掀抹。此參數(shù)不能為空
queue:為異步調(diào)用提交塊對象的調(diào)度隊列。隊列被系統(tǒng)保留心俗,直到該塊運行到完成為止傲武。此參數(shù)不能為空
block:異步執(zhí)行的塊對象。這個函數(shù)執(zhí)行代表調(diào)用者的block_copy和block_release
-
dispatch_group_async_f
1.這個方法跟dispatch_group_async差不多城榛,只是第三個參數(shù)為c語言函數(shù)
-
dispatch_group_notify_f
1.當(dāng)group中的任務(wù)都完成以后會執(zhí)行block.注意這句代碼要加到所有任務(wù)提交之后才管用.參數(shù)queue代表block會提交到哪個隊列中
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, serialQueue, ^{
NSLog(@"串行隊列任務(wù)一開始");
[NSThread sleepForTimeInterval:2];
NSLog(@"串行隊列任務(wù)一快結(jié)束:%@",[NSThread currentThread]);
});
dispatch_group_async(group, serialQueue, ^{
NSLog(@"串行隊列任務(wù)二開始");
[NSThread sleepForTimeInterval:2];
NSLog(@"串行隊列任務(wù)二快結(jié)束:%@",[NSThread currentThread]);
});
dispatch_group_async(group, conCurrentQueue, ^{
NSLog(@"并行隊列任務(wù)二開始");
[NSThread sleepForTimeInterval:2];
NSLog(@"并行隊列任務(wù)二快結(jié)束:%@",[NSThread currentThread]);
});
dispatch_group_notify(group, conCurrentQueue, ^{
NSLog(@"被通知的并行隊列任務(wù)三");
});
//結(jié)果時“被通知的并行隊列任務(wù)三”是在所有任務(wù)都執(zhí)行完成后才執(zhí)行
-
dispatch_group_wait
1.為先前提交的塊對象同步地等待完成揪利;如果在指定的超時時間結(jié)束之前塊沒有完成,則返回
2.同步等待會阻塞線程狠持,跟dispatch_block_wait原理一樣
dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, conCurrentQueue, ^{
NSLog(@"任務(wù)一開始");
[NSThread sleepForTimeInterval:2];
NSLog(@"任務(wù)一快結(jié)束");
});
dispatch_group_async(group, conCurrentQueue, ^{
NSLog(@"任務(wù)二開始");
[NSThread sleepForTimeInterval:6];
NSLog(@"任務(wù)二快結(jié)束");
});
dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC));
long result=dispatch_group_wait(group, time);
if (result==0) {
NSLog(@"組的block全部執(zhí)行完成");
}
else{
NSLog(@"組的block沒有全部執(zhí)行完成疟位,是timeout返回");
}
NSLog(@"-----------");
-
dispatch_group_enter
1.用這個方法指定一個操作將要加到group中,用來替代dispatch_group_async
,注意它只能和dispatch_group_leave
配對使用.
2.這種方式比dispatch_group_async更加靈活.比如我們可以在任務(wù)的完成回調(diào)里面寫dispatch_group_leave()
dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(conCurrentQueue, ^{
NSLog(@"任務(wù)一開始");
[NSThread sleepForTimeInterval:2];
NSLog(@"任務(wù)一快結(jié)束");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(conCurrentQueue, ^{
NSLog(@"任務(wù)二開始");
[NSThread sleepForTimeInterval:2];
NSLog(@"任務(wù)二快結(jié)束");
dispatch_group_leave(group);
});
dispatch_group_notify(group, conCurrentQueue, ^{
NSLog(@"被通知任務(wù)開始");
});
NSLog(@"-----");
-
Using Dispatch Semaphores(利用調(diào)度信號量)
關(guān)于信號量的解釋,借別人的一個例子:
停車場剩余4個車位喘垂,那么即使同時來了四輛車也能停的下甜刻。如果此時來了五輛車,那么就有一輛需要等待正勒。信號量的值就相當(dāng)于剩余車位的數(shù)目得院,dispatch_semaphore_wait函數(shù)就相當(dāng)于來了一輛車,dispatch_semaphore_signal章贞。就相當(dāng)于走了一輛車祥绞。停車位的剩余數(shù)目在初始化的時候就已經(jīng)指明了(dispatch_semaphore_create(value:Int))),調(diào)用一次dispatch_semaphore_signal鸭限,剩余的車位就增加一個就谜;調(diào)用一次dispatch_semaphore_wait剩余車位就減少一個;當(dāng)剩余車位為0時里覆,再來車(即調(diào)用dispatch_semaphore_wait)就只能等待丧荐。有可能同時有幾輛車等待一個停車位。有些車主喧枷。沒有耐心虹统,給自己設(shè)定了一段等待時間弓坞,這段時間內(nèi)等不到停車位就走了,如果等到了就開進(jìn)去停車车荔。而有些車主就像把車停在這渡冻,所以就一直等下去
-
dispatch_semaphore_create
- 該函數(shù)使用一個初始值創(chuàng)建一個dispatch_semaphore_t類型的信號量,注意:這里的傳入的參數(shù)value必須大于或等于0,否則dispatch_semaphore_create會返回NULL
2.參數(shù)就是信號量的初始值
-
dispatch_semaphore_wait
1.等待信號量忧便,該函數(shù)會使傳入的信號量dsema的值減1
2.函數(shù)的作用:如果dsema信號量的值大于0族吻,該函數(shù)所處線程就繼續(xù)執(zhí)行下面的語句,并且將信號量的值減1珠增;如果desema的值為0超歌,那么這個函數(shù)就阻塞當(dāng)前線程等待timeout(注意timeout的類型為dispatch_time_t,需要傳入對應(yīng)的類型參數(shù))蒂教,如果等待的期間desema的值被dispatch_semaphore_signal函數(shù)加1了巍举,且該函數(shù)(即dispatch_semaphore_wait)所處線程獲得了信號量,那么就繼續(xù)向下執(zhí)行并將信號量減1, 如果等待期間沒有獲取到信號量或者信號量的值一直為0凝垛,那么等到timeout時懊悯,其所處線程自動執(zhí)行其后語句。
-
dispatch_semaphore_signal
1.當(dāng)返回值為0時表示當(dāng)前并沒有線程等待其處理的信號量梦皮,其處理的信號量的值加1即可炭分。當(dāng)返回值不為0時,表示其當(dāng)前有(一個或多個)線程等待其處理的信號量剑肯,并且該函數(shù)喚醒了一個等待的線程(當(dāng)線程有優(yōu)先級時捧毛,喚醒優(yōu)先級最高的線程;否則隨機喚醒.
-
關(guān)于信號量的用途和總結(jié)
0.注意退子,正常的使用順序是先降低然后再提高,這兩個dispatch_semaphore_wait 和dispatch_semaphore_signal函數(shù)通常成對使用
1.如果初始化信號量為1的話型将,相當(dāng)于給線程加鎖寂祥,因為信號量為1,不管什么情況下七兜,都會保證只有一個線程再訪問此關(guān)鍵代碼丸凭,是線程安全
2.可以相當(dāng)于設(shè)置最大并發(fā)數(shù)量,比如初始化的信號量為4腕铸,就算有五個線程來了惜犀,最多的情況也只會有四個同時進(jìn)行
3.加鎖
如上所示,crash的原因翻譯過來是:就是說你malloc分配的內(nèi)存賦值給了一個已經(jīng)被釋放的指針(此指針已不存在)狠裹,其實我暫時不明白為什么會這樣報錯虽界,我的理解是也是因為多線程同時寫數(shù)組的的問題
修改成如下就行
dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray * array = [[NSMutableArray alloc] init];
for (int i =1; i<100; i++) {
dispatch_async(myQueue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[array addObject:[NSString stringWithFormat:@"%d",i]];
dispatch_semaphore_signal(semaphore);
});
}
4.設(shè)置多線程最大并發(fā)數(shù)
//crate的value表示,最多幾個資源可訪問
dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//任務(wù)1
dispatch_async(quene, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 1");
sleep(1);
NSLog(@"complete task 1");
dispatch_semaphore_signal(semaphore);
});
//任務(wù)2
dispatch_async(quene, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 2");
sleep(1);
NSLog(@"complete task 2");
dispatch_semaphore_signal(semaphore);
});
//任務(wù)3
dispatch_async(quene, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 3");
sleep(1);
NSLog(@"complete task 3");
dispatch_semaphore_signal(semaphore);
});
/*
2017-07-07 17:07:41.632 多線程-GCD[1125:163408] run task 1
2017-07-07 17:07:41.632 多線程-GCD[1125:163421] run task 2
2017-07-07 17:07:42.634 多線程-GCD[1125:163408] complete task 1
2017-07-07 17:07:42.635 多線程-GCD[1125:163421] complete task 2
2017-07-07 17:07:42.635 多線程-GCD[1125:163405] run task 3
2017-07-07 17:07:43.640 多線程-GCD[1125:163405] complete task 3
總結(jié):由于設(shè)定的信號值為2涛菠,先執(zhí)行兩個線程莉御,等執(zhí)行完一個撇吞,才會繼續(xù)執(zhí)行下一個,保證同一時間執(zhí)行的線程數(shù)不超過2
這也相當(dāng)于設(shè)置了多線程的最大并發(fā)數(shù)
*/
-
Using Dispatch Barriers(柵欄)
對于柵欄的理解:假設(shè)我們原先有10個任務(wù)要執(zhí)行礁叔,我們現(xiàn)在要插入一個任務(wù)5牍颈,這個任務(wù)5要在1,2琅关,3煮岁,4,都并發(fā)執(zhí)行完了之后才能執(zhí)行涣易,而6画机,7,8都毒,9色罚,10號任務(wù)要在這個任務(wù)5結(jié)束后才允許并發(fā)。這是就需要用到Barriers账劲,當(dāng)然group也可以實現(xiàn)戳护,但是這個方法更好,關(guān)于柵欄的只能是同一個隊列,而group 可以是不同隊列瀑焦,柵欄最好別用系統(tǒng)的全部隊列而是使用自己的全部隊列
-
dispatch_barrier_async
1.提交異步執(zhí)行的障礙塊并立即返回腌且,不會阻塞線程
2.該方法的功能跟dispatch_async類似
-
dispatch_barrier_async_f
1.跟dispatch_barrier_async方法一樣,只會提交的是c函數(shù)
-
dispatch_barrier_sync
1.提交一個用于執(zhí)行的屏障塊對象榛瓮,并等待該塊完成
2.該方法功能跟dispatch_sync類似
-
dispatch_barrier_sync_f
1.跟dispatch_barrier_async方法一樣铺董,只會提交的是c函數(shù)
-
Managing Dispatch Sources
這個管理類對于我而言還是很少用到的,不過有個確實經(jīng)常用到的就是 time