当我向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队列似乎应该至少避免主线程,如果没有一个首选线程。我有一些奇怪的错误,所以我需要弄清楚发生了什么。谢谢!
答案 0 :(得分:4)
这种优化是可能的,因为performBlockAndWait:
执行了块
同步,即该方法在块完成之前不会返回。
因此,该块不会与其他操作并行执行
主线。
(出于同样的原因,dispatch_sync(queue, ...)
可以在主线程上执行一个块
而不是一个单独的线程。)