通过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 1
,main 2
和main 3
(如bg 1
,bg 2
和bg 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队列。
区分performBlock
和performBlockAndWait
很重要。performBlock
是异步的,因此它只是将块放入队列中并立即返回。这些块将按顺序执行。这就是为什么“main1”将始终在“main3”之前执行的原因。performBlockAndWait
是同步的,因此无法按照定义处理队列。这意味着它将立即执行该块,并且直到完成后才返回。
如果不这样做,它将阻塞,因为队列不为空,否则必须先执行队列中的所有其他任务。
现在,为什么要安排“bg1”早于“bg2”的原因。我几乎可以肯定,如果多次执行此测试,最终可能会有所不同。
如果主线程更快地到达同步“bg2”,它将首先出现。
关于ios - NSMainQueueConcurrencyType和NSPrivateQueueConcurrencyType上下文上的并发?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47588925/