使用NSMainQueueConcurrencyType初始化的托管对象上下文与NSPrivateQueueConcurrencyType绑定到主队列和专用队列,它们是以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}
鉴于主队列和私有队列都是串行的,它背后的理论是什么?
答案 0 :(得分:2)
并发性是非确定性的。你唯一能保证的是“main1”正在“main3”之前执行,因为正如你所说的那样,它是一个FIFO队列。
区分performBlock
和performBlockAndWait
非常重要。
performBlock
是异步的,因此它只是将块放入队列并立即返回。这些块将按顺序执行。这就是为什么“main1”将始终在“main3”之前执行。
performBlockAndWait
是同步的,因此无法按照定义处理队列。这意味着它将立即执行该块,并且在完成之前不会返回。
如果它没有这样做,它会阻塞,因为队列不是空的,或者它必须首先执行队列中的所有其他任务。
现在为什么“bg1”出现在“bg2”之前的原因是调度。我几乎可以肯定,如果你多次执行这个测试,最终可能会有所不同。 如果主线程更快到达同步“bg2”,它将首先出现。