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

Ios 为什么NSManagedObjectContext队列在主线程上执行?,ios,core-data,Ios,Core Data,当我向我的主运行中心发送类型为NSPrivateQueueConcurrencyType的performBlock消息时,如下所示: [self.privateManagedObjectContext performBlockAndWait:^{ if ([[NSThread currentThread] isMainThread]) { NSLog(@"executing on the main thread!!"); } … }];

当我向我的主运行中心发送类型为
NSPrivateQueueConcurrencyType
performBlock
消息时,如下所示:

[self.privateManagedObjectContext performBlockAndWait:^{
    if ([[NSThread currentThread] isMainThread]) {
        NSLog(@"executing on the main thread!!");        
    }
    …
}];
我发现,默认情况下,它在主线程上执行。上述代码中的条件触发,问题导航器指示执行发生在
NSManagedObject队列中的
线程1

这让我感到非常困惑,因为Apple告诉我们“每个线程必须有自己的完全私有的托管对象上下文。”考虑到
NSMainQueueConcurrencyType
类型的MOC将使用主线程,对于
NSPrivateQueueConcurrencyType
类型的MOC来说,使用主线程是否违反了线程限制


我的代码在主线程上的执行正常吗?我误解了你的意思吗?我知道队列不一定绑定到特定的线程,但是在这种情况下,如果没有一个转到线程,私有MOC队列至少应该避免主线程。我有一些奇怪的虫子,所以我需要弄清楚到底发生了什么。谢谢

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

(出于同样的原因,
dispatch\u sync(queue,…)
可能会在主线程上执行块
是的,这篇文章所描述的是正确的,但它是否给了这个问题一个答案?@Chengjiong:我想我已经回答了这个问题。您认为缺少什么?您解释了为什么performBlockAndWait:中的块是在主线程中执行的,但正如我在问题中看到的,mkc842想知道为什么NSPrivateQueueConcurrencyType上下文可以在主线程上运行,这是否违反了苹果的规则,我也想知道这些。@Chengjiong:NSPrivateQueueConcurrencyType指定上下文与私有调度队列相关联。队列未绑定到固定线程。GCD可以选择从主线程上的非主队列执行块,因为不可能有任何其他代码同时在主线程上执行。这是一个减少线程切换数量的优化。酷,你消除了我的疑虑。我还有一个问题,希望你能帮助我:)。问题是,我在主线程中创建了一个类型为NSPrivateQueueConcurrencyType的上下文,这是否意味着我只能在主线程中使用它管理的上下文和nsManagedObject?