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

mkc*_*842 4 core-data ios

当我向performBlock我的 MOC 类型发送消息时NSPrivateQueueConcurrencyType,如下所示:

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

我发现,默认情况下,这在主线程上执行。上述代码中的条件触发,并且问题导航器指示正在执行Thread 1NSManagedObject Queue.

这让我很困惑,因为 Apple 告诉我们“每个线程必须有自己完全私有的托管对象上下文”。鉴于类型的 MOCNSMainQueueConcurrencyType将使用主线程,它是否违反NSPrivateQueueConcurrencyType了使用主线程类型的 MOC 的线程限制?

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

Mar*_*n R 5

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

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

  • @Chengjiong:NSPrivateQueueConcurrencyType 指定上下文与私有调度 *queue* 相关联。队列不绑定到固定的*线程*。GCD 可以选择在主线程上执行非主队列中的块,因为不可能有任何其他代码同时在主线程上执行。这是一种减少线程切换次数的优化。 (4认同)