Почему NSManagedObjectContext Queue выполняется в основном потоке?

Когда я отправляю сообщение performBlock моему MOC типа NSPrivateQueueConcurrencyType, например:

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

Я нахожу, что по умолчанию это выполняется в основном потоке. Условное значение в приведенном выше коде запускается, и Navigator Navigator указывает, что выполнение происходит на Thread 1 в NSManagedObject Queue.

Это очень озадачивает меня, потому что Apple говорит нам, что "каждый поток должен иметь свой собственный полностью закрытый контекст управляемых объектов". Учитывая, что MOC типа NSMainQueueConcurrencyType будет использовать основной поток, не нарушает ли ограничение потока для MOC типа NSPrivateQueueConcurrencyType для использования основного потока?

Является ли выполнение моего кода на основном потоке нормальным? Неужели я неправильно понял ограничение на лишение свободы? Я понимаю, что очередь не обязательно привязана к определенному потоку, но в этом случае кажется, что приватная очередь MOC должна, как минимум, избегать основного потока, если не иметь ни одного сквозного потока. У меня есть некоторые странные ошибки, поэтому мне нужно выяснить, что происходит. Спасибо!

Ответ 1

Эта оптимизация возможна, потому что performBlockAndWait: выполняет блок синхронно, то есть метод не возвращается до завершения блока. Поэтому блок не будет выполняться параллельно с другими операциями основной поток.

(По той же причине dispatch_sync(queue, ...) может выполнить блок в основном потоке вместо отдельного потока.)