ios - 将 block 并发插入并发队列

标签 ios objective-c macos cocoa grand-central-dispatch

我想将 block A、B、C 添加到全局并发队列中。 之后我想立即向同一个队列添加屏障。

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

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

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

最佳答案

屏障不适用于全局队列。创建您自己的自定义并发队列。作为dispatch_barrier_async documentation说:

The queue you specify should be a concurrent queue that you create yourself using the dispatch_queue_create function. If the queue you pass to this function is a serial queue or one of the global concurrent queues, this function behaves like the dispatch_async function.

然后,在屏障之后分派(dispatch)到该队列的任何内容都不会在屏障之后运行。因此调度 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"); 
});

关于ios - 将 block 并发插入并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233343/

相关文章:

ios - 在 `cellForRowAt` 中激活 NSLayoutConstraint 直到滚动后才会呈现

iphone - 在 iPhone 中安装 ipa 文件,而不将其设备 ID 添加到配置文件中

macos - PyCrypto 在 CFB 模式下与 CommonCrypto 的兼容性?

Objective-C:在 OS X 中绘制二维图形

objective-c - 从 C 数组创建 NSArray

swift - 在 MacOS 上使用 swift 3 在登录钥匙串(keychain)中安装证书

android - React Native 文本输入更新很慢

ios - Cocos2d V3.0隐藏iAd

ios - CoreData 在子托管对象上下文中使用获取的属性崩溃

java - 每当更新变量时自动执行代码