欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

GCD - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(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í)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 技術(shù)分享 >

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)案例查看更多