SMainQueueConcurrencyType和NSPriv

SMainQueueConcurrencyType和NSPriv

通过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}

考虑到主队列和专用队列都是串行的,它背后的理论是什么?

最佳答案

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

区分performBlockperformBlockAndWait很重要。
performBlock是异步的,因此它只是将块放入队列中并立即返回。这些块将按顺序执行。这就是为什么“main1”将始终在“main3”之前执行的原因。
performBlockAndWait是同步的,因此无法按照定义处理队列。这意味着它将立即执行该块,并且直到完成后才返回。
如果不这样做,它将阻塞,因为队列不为空,否则必须先执行队列中的所有其他任务。

现在,为什么要安排“bg1”早于“bg2”的原因。我几乎可以肯定,如果多次执行此测试,最终可能会有所不同。
如果主线程更快地到达同步“bg2”,它将首先出现。

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

10-10 21:07