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

时间:2014-04-08 21:19:04

标签: ios core-data

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

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

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

这对我来说非常令人费解,因为Apple告诉我们"每个线程必须拥有自己完全私有的托管对象上下文。"鉴于NSMainQueueConcurrencyType类型的MOC将使用主线程,它是否违反了类型NSPrivateQueueConcurrencyType的MOC使用主线程的线程限制?

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

1 个答案:

答案 0 :(得分:4)

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

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