• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 上下文的并发?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 03:32:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

使用 NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 初始化的托管对象上下文与主队列和私有(private)队列相关联,它们是串行队列,操作按 FIFO 顺序执行。

下面的示例代码:

NSLog(@"Current thread : %@", [NSThread currentThread]);

[mainMoc performBlock:^{
    NSLog(@"main 1 - %@", [NSThread currentThread]);

}];

[mainMoc performBlockAndWait:^{
    NSLog(@"main 2 - %@", [NSThread currentThread]);

}];

[mainMoc performBlock:^{
    NSLog(@"main 3 - %@", [NSThread currentThread]);

}];

[bgMoc performBlock:^{
    NSLog(@"bg 1 - %@", [NSThread currentThread]);

}];

[bgMoc performBlockAndWait:^{
    NSLog(@"bg 2 - %@", [NSThread currentThread]);

}];

[bgMoc performBlock:^{
    NSLog(@"bg 3 - %@", [NSThread currentThread]);

}];

我期待它打印出来

main 1main 2main 3 类似 bg 1bg 2bg 3 以串行顺序排列,但这是打印出来的:

Current thread : <NSThread: 0x60000006fb80>{number = 1, name = main}
main 2 - <NSThread: 0x60000006fb80>{number = 1, name = main}
bg 1 - <NSThread: 0x600000268900>{number = 3, name = (null)}
bg 2 - <NSThread: 0x60000006fb80>{number = 1, name = main}
bg 3 - <NSThread: 0x600000268900>{number = 3, name = (null)}
main 1 - <NSThread: 0x60000006fb80>{number = 1, name = main}
main 3 - <NSThread: 0x60000006fb80>{number = 1, name = main}

考虑到主队列和私有(private)队列都是串行的,它背后的理论是什么?



Best Answer-推荐答案


并发是不确定的。您唯一可以保证的是“main1”在“main3”之前执行,因为正如您所说,它是一个 FIFO 队列。

区分 performBlockperformBlockAndWait 很重要。

performBlock 是异步的,所以它只是将 block 放入队列并立即返回。这些 block 将按顺序执行。这就是为什么“main1”总是在“main3”之前执行。

performBlockAndWait 是同步的,因此不能按照定义处理队列。这意味着它将立即执行该 block ,并且在完成之前不会返回。 如果它不这样做,它会阻塞,因为队列不是空的,否则它必须先执行队列中的所有其他任务。

现在“bg1”出现在“bg2”之前的原因是调度。我几乎可以肯定,如果你多次执行这个测试,它最终可能会有所不同。 如果主线程更快地到达同步的“bg2”,它将首先出现。

关于ios - NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 上下文的并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47588925/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap