热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

将块并发插入并发队列

如何解决《将块并发插入并发队列》经验,为你挑选了1个好方法。

我想将块A,B,C添加到全局并发队列中。之后,我想立即向同一队列添加障碍。

我希望A,B,C都以某种顺序调用,但是当所有块终止时,将调用该屏障。

如何保证在此序列的中间不会插入其他块?例如,如果在其他地方我将块X部署在同一队列中,则我不希望在屏障之前执行它。

MacOS和iOS上都可以使用相同的解决方案吗?



1> Rob..:

障碍不适用于全局队列。创建自己的自定义并发队列。如dispatch_barrier_async 文档所述:

您指定的队列应该是使用该dispatch_queue_create函数创建的并发队列。如果传递给此函数的队列是串行队列或全局并发队列之一,则此函数的行为类似于该dispatch_async函数。

然后,任何在屏障之后调度到该队列的内容都不会运行,直到屏障之后。因此,分派A,B和C。然后以障碍物分派D。然后调度X。A,B和C将相对于彼此同时运行,完成后,D将运行,而完成D之后,X将运行。在macOS和iOS上都是这样。只需创建自己的自定义并发队列即可。

dispatch_queue_t queue = dispatch_queue_create("com.company.app.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{ 
    NSLog(@"start - A!\n");  
    sleep(4);  
    NSLog(@"end - A!\n");
});

dispatch_async(queue, ^{  
    NSLog(@"start - B!\n");  
    sleep(2);  
    NSLog(@"end - B!\n"); 
});

dispatch_async(queue, ^{  
    NSLog(@"start - C!\n");  
    sleep(3);  
    NSLog(@"end - C!\n"); 
});

dispatch_barrier_async(queue, ^{  
    NSLog(@"Barrier - D\n");  
});

dispatch_async(queue, ^{  
    NSLog(@"start - X!\n");  
    sleep(3);  
    NSLog(@"end - X!\n"); 
});


推荐阅读
author-avatar
ESC咻咻_973
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有