为什么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理对象上下文”。 假定NSMainQueueConcurrencyType
types的MOC将使用主线程,是不是违反了NSPrivateQueueConcurrencyType
types的MOC的线程约束来使用主线程?
我的代码在主线程上执行正常吗? 我误解了线程禁闭吗? 我明白,一个队列不一定绑定到一个特定的线程,但在这种情况下,似乎私人MOC队列应该至less避免主线程,如果没有一个单一的线程。 我有一些奇怪的错误,所以我需要弄清楚是怎么回事。 谢谢!
这种优化是可能的,因为performBlockAndWait:
同步执行块,即方法不会返回,直到块完成。 因此该块不会与主线程上的其他操作并行执行。
(出于同样的原因, dispatch_sync(queue, ...)
可能会在主线程上执行一个块,而不是一个单独的线程)。