知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
GCD
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):29
dispatch_group
如不雅想在dispatch_queue中所有的義務(wù)履行完成后在做某種操作,在串行隊(duì)列中,可以把該操作放到最后一個(gè)義務(wù)履行完成后持續(xù),然則在并行隊(duì)列中怎么做呢。這就有dispatch_group 成組操作。比如
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT); dispatch_group_t dispatchGroup = dispatch_group_create(); dispatch_group_async(dispatchGroup, dispatchQueue, ^(){ NSLog(@"dispatch-1"); }); dispatch_group_async(dispatchGroup, dispatchQueue, ^(){ NSLog(@"dspatch-2"); }); dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){ NSLog(@"end"); });
[img]http://common.cnblogs.com/images/copycode.gif
膳綾擎的 log1 和log2輸出次序不定,因?yàn)槭窃诓⑿嘘?duì)列上履行,當(dāng)場(chǎng)行隊(duì)列全部履行完成后,最后到main隊(duì)列上履行一個(gè)操作,包管“end”是最后輸出。 別的,這里也可以不消創(chuàng)建本身的并行隊(duì)列,用全局的global,那個(gè)也是個(gè)并行隊(duì)列. dispatch_get_gloable_queue(0,0);
dispatch_barrier_async
先看段代碼
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-1"); }); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-2"); }); dispatch_barrier_async(concurrentQueue, ^(){ NSLog(@"dispatch-barrier"); }); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-3"); }); dispatch_async(concurrentQueue, ^(){ NSLog(@"dispatch-4"); });
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_barrier_async 感化是在并行隊(duì)列中,等待前面兩個(gè)操作并行操作完成,這里是并行輸出
dispatch-1,dispatch-2
然后履行
dispatch_barrier_async中的操作,(如今就只會(huì)履行章一操作)履行完成后,即輸出
"dispatch-barrier, 最后該并行隊(duì)列恢答復(fù)復(fù)興有履行狀況,持續(xù)并行履行
dispatch-3,dispatch-4
dispatch_async 和dispatch_sync
dispatch_sync(),同步添加操作。他是等待添加進(jìn)隊(duì)列瑯綾擎的操作完成之后再持續(xù)履行。
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_sync(concurrentQueue, ^(){ NSLog(@"2"); [NSThread sleepForTimeInterval:10]; NSLog(@"3"); }); NSLog(@"4"); 輸出 :
11:36:25.313 GCDSeTest[544:303] 1
11:36:25.313 GCDSeTest[544:303] 2
11:36:30.313 GCDSeTest[544:303] 3//模仿長(zhǎng)時(shí)光操作
11:36:30.314 GCDSeTest[544:303] 4
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_async ,異步添加進(jìn)義務(wù)隊(duì)列,它不會(huì)做任何等待
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_async(concurrentQueue, ^(){ NSLog(@"2"); [NSThread sleepForTimeInterval:5]; NSLog(@"3"); }); NSLog(@"4"); 輸出:
11:42:43.820 GCDSeTest[568:303] 1
11:42:43.820 GCDSeTest[568:303] 4
11:42:43.820 GCDSeTest[568:1003] 2
11:42:48.821 GCDSeTest[568:1003] 3//模仿長(zhǎng)時(shí)光操作時(shí)光
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_apply
dispathc_apply 是dispatch_sync 和dispatch_group的接洽關(guān)系A(chǔ)PI.它以指定的次數(shù)將指定的Block參加到指定的隊(duì)列中。并等待隊(duì)列中操作全部完成.
[img]http://common.cnblogs.com/images/copycode.gif
NSArray *array = [NSArray arrayWithObjects:@"/Users/chentao/Desktop/copy_res/gelato.ds", @"/Users/chentao/Desktop/copy_res/jason.ds", @"/Users/chentao/Desktop/copy_res/jikejunyi.ds", @"/Users/chentao/Desktop/copy_res/molly.ds", @"/Users/chentao/Desktop/copy_res/zhangdachuan.ds", nil]; NSString *copyDes = @"/Users/chentao/Desktop/copy_des"; NSFileManager *fileManager = [NSFileManager defaultManager]; dispatch_async(dispatch_get_global_queue(0, 0), ^(){ dispatch_apply([array count], dispatch_get_global_queue(0, 0), ^(size_t index){ NSLog(@"copy-%ld", index); NSString *sourcePath = [array objectAtIndex:index]; NSString *desPath = [NSString stringWithFormat:@"%@/%@", copyDes, [sourcePath lastPathComponent]]; [fileManager copyItemAtPath:sourcePath toPath:desPath error:nil]; }); NSLog(@"done"); });
[img]http://common.cnblogs.com/images/copycode.gif
輸出 copy-index 次序不肯定,因?yàn)樗遣⑿新男械模╠ispatch_get_global_queue是并行隊(duì)列),然則done是在以上拷貝操作完成后才會(huì)履行,是以,它一般都是放在dispatch_async瑯綾擎(異步)。實(shí)際上,這里 dispatch_apply如不雅換成串行隊(duì)列上,則會(huì)依次輸出index,但如許違背了我們想并行進(jìn)步履行效力的初志。
dispatch_semaphore
dispatch_semaphore 旌旗燈號(hào)量基于計(jì)數(shù)器的一種多線程同步機(jī)制。在多個(gè)線查拜訪共有資本時(shí)刻,會(huì)因?yàn)槎嗑€程的特點(diǎn)而激發(fā)數(shù)據(jù)掉足的問題。
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray *array = [NSMutableArrayarray];
for (int index = 0; index < 100000; index++) {
dispatch_async(queue, ^(){
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//
NSLog(@"addd :%d", index);
[array addObject:[NSNumber numberWithInt:index]];
dispatch_semaphore_signal(semaphore);
});
}
[img]http://common.cnblogs.com/images/copycode.gif
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 如不雅semaphore計(jì)數(shù)大年夜于等于1.計(jì)數(shù)-1,返回,法度榜樣持續(xù)運(yùn)行。如不雅計(jì)數(shù)為0,則等待。這里設(shè)置的等待時(shí)光是一向等待。dispatch_semaphore_signal(semaphore);計(jì)數(shù)+1.在這兩句代鋁闥殤的履行代碼,每次只會(huì)許可一個(gè)線程進(jìn)入,如許就有效的包管了在多線程情況下,只能有一個(gè)線程進(jìn)入。
相關(guān)案例查看更多
相關(guān)閱讀
- 網(wǎng)站小程序
- 生成海報(bào)
- 百度快速排名
- 南通小程序制作公司
- 做網(wǎng)站
- 網(wǎng)站開發(fā)
- 網(wǎng)站優(yōu)化
- 云南網(wǎng)站建設(shè)方案 doc
- 網(wǎng)站建設(shè)服務(wù)
- 昆明小程序設(shè)計(jì)
- 小程序模板開發(fā)公司
- 小程序被攻擊
- 搜索引擎自然排名
- 云南網(wǎng)站建設(shè)服務(wù)
- 云南做軟件
- 汽車報(bào)廢回收
- 開發(fā)微信小程序
- 小程序生成海報(bào)
- 云南網(wǎng)站建設(shè)費(fèi)用
- 軟件開發(fā)
- 網(wǎng)站建設(shè)公司哪家好
- 日歷組件
- 網(wǎng)站排名優(yōu)化
- 報(bào)廢車管理系統(tǒng)
- 正規(guī)網(wǎng)站建設(shè)公司
- 云南網(wǎng)絡(luò)營(yíng)銷
- 網(wǎng)站制作哪家好
- 跳轉(zhuǎn)小程序
- 云南網(wǎng)站制作哪家好
- 云南網(wǎng)站建設(shè)公司排名