Ответ 1
Сначала рецепт новых типов контекста Core Data.
NSMainQueueConcurrencyType
создает контекст, связанный с основной диспетчерской очередью и, таким образом, основной поток. Вы можете использовать такой контекст, чтобы связать его с объектами, которые необходимы для запуска в основном потоке, например элементы пользовательского интерфейса.
NSPrivateQueueConcurrencyType
создает и управляет частной диспетчерской очередью для работы. Вы должны использовать новые методы performBlock:
или performBlockAndWait:
. Затем контекст выполнит переданные блоки в собственной частной очереди.
Наконец, NSConfinementConcurrencyType
является типом по умолчанию и может использоваться только в потоке, где он был создан. Таким образом, в вашем NSOperation
вы использовали его в правильном порядке. Простое примечание. Если вы хотите использовать его в качестве дочернего контекста, вам нужно иметь "контекст очереди" (NSMainQueueConcurrencyType
или NSPrivateQueueConcurrencyType
).
Теперь о вашем вопросе.
Инициализирует NSManagedObjectContext, используя NSMainQueueConcurrencyType только для ситуации, когда этот MOC имеет дочерний MOC, который был инициализирован с использованием NSPrivateQueueConcurrencyType?
Нет, не нужно. Да, вы можете настроить частный контекст, который выполняет некоторую работу в фоновом режиме, а затем подталкивает восстановленные объекты к основному, но я буду делать наоборот: используйте NSPrivateQueueConcurrencyType
в качестве основного контекста и NSMainQueueConcurrencyType
в качестве дочернего контекст для первого. Таким образом, основной контекст будет касаться только объектов, находящихся в памяти. Сохранение на диск выполняется только в частной очереди.
Этот подход используется классом UIManagedDocument
. Сохранение на диск выполняется в фоновом потоке (приватная очередь). Таким образом, пользовательский интерфейс не замерзает.