为什么NSManagedObjectContext队列在主线程上执行?

当我发送一个performBlock消息给我的types为NSPrivateQueueConcurrencyType MOC时,像这样:

 [self.privateManagedObjectContext performBlockAndWait:^{ if ([[NSThread currentThread] isMainThread]) { NSLog(@"executing on the main thread!!"); } … }]; 

我发现,默认情况下,这在主线程上执行。 上述代码中的条件触发器,Issue Navigator指出NSManagedObject Queue中的Thread 1上正在执行。

这让我非常困惑,因为苹果告诉我们“每个线程都必须拥有完全私有的pipe理对象上下文”。 假定NSMainQueueConcurrencyTypetypes的MOC将使用主线程,是不是违反了NSPrivateQueueConcurrencyTypetypes的MOC的线程约束来使用主线程?

我的代码在主线程上执行正常吗? 我误解了线程禁闭吗? 我明白,一个队列不一定绑定到一个特定的线程,但在这种情况下,似乎私人MOC队列应该至less避免主线程,如果没有一个单一的线程。 我有一些奇怪的错误,所以我需要弄清楚是怎么回事。 谢谢!

这种优化是可能的,因为performBlockAndWait: 同步执行块,即方法不会返回,直到块完成。 因此该块不会与主线程上的其他操作并行执行。

(出于同样的原因, dispatch_sync(queue, ...)可能会在主线程上执行一个块,而不是一个单独的线程)。