Подтвердить что ты не робот

Когда использовать Core Data NSMainQueueConcurrencyType?

Инициализирует NSManagedObjectContext с помощью NSMainQueueConcurrencyType только для ситуации, когда этот MOC имеет дочерний MOC, который был инициализирован с помощью NSPrivateQueueConcurrencyType?

Чтобы дать некоторый фон: мое приложение имеет традиционную структуру, в которой основной вид таблицы управляется NSFetchedResultsController, и данные импортируются асинхронно из веб-службы с использованием подкласса NSOperation, который имеет свой собственный MOC. Я не был уверен, что оба MOC в этой ситуации должны использовать NSConfinementConcurrencyType (по умолчанию, я полагаю), или MOC, связанный с выбранным контроллером результатов на основном потоке, должен использовать NSMainQueueConcurrencyType, а фоновый MOC должен использовать NSConfinementConcurrencyType.

4b9b3361

Ответ 1

Сначала рецепт новых типов контекста Core Data.

NSMainQueueConcurrencyType создает контекст, связанный с основной диспетчерской очередью и, таким образом, основной поток. Вы можете использовать такой контекст, чтобы связать его с объектами, которые необходимы для запуска в основном потоке, например элементы пользовательского интерфейса.

NSPrivateQueueConcurrencyType создает и управляет частной диспетчерской очередью для работы. Вы должны использовать новые методы performBlock: или performBlockAndWait:. Затем контекст выполнит переданные блоки в собственной частной очереди.

Наконец, NSConfinementConcurrencyType является типом по умолчанию и может использоваться только в потоке, где он был создан. Таким образом, в вашем NSOperation вы использовали его в правильном порядке. Простое примечание. Если вы хотите использовать его в качестве дочернего контекста, вам нужно иметь "контекст очереди" (NSMainQueueConcurrencyType или NSPrivateQueueConcurrencyType).

Теперь о вашем вопросе.

Инициализирует NSManagedObjectContext, используя NSMainQueueConcurrencyType только для ситуации, когда этот MOC имеет дочерний MOC, который был инициализирован с использованием NSPrivateQueueConcurrencyType?

Нет, не нужно. Да, вы можете настроить частный контекст, который выполняет некоторую работу в фоновом режиме, а затем подталкивает восстановленные объекты к основному, но я буду делать наоборот: используйте NSPrivateQueueConcurrencyType в качестве основного контекста и NSMainQueueConcurrencyType в качестве дочернего контекст для первого. Таким образом, основной контекст будет касаться только объектов, находящихся в памяти. Сохранение на диск выполняется только в частной очереди.

Этот подход используется классом UIManagedDocument. Сохранение на диск выполняется в фоновом потоке (приватная очередь). Таким образом, пользовательский интерфейс не замерзает.

Ответ 2

NSMainQueueConcurrencyType в основном для контекстов, связанных с пользовательским интерфейсом.

Чтобы пользовательский интерфейс реагировал, большая часть бизнес-логики лучше всего делать в фоновом потоке и в "фоновых" контекстах. Но сам пользовательский интерфейс должен будет использовать контекст в какой-то момент, т.е. NSMainQueueConcurrencyType.

Контексты для детей с NSMainQueueConcurrencyType хорошо подходят для редактирования панелей, где изменения могут быть сохранены сразу, т.е. зафиксированы в родительском контексте. Родителю не нужно использовать NSMainQueueConcurrencyType.

NSConfinementConcurrencyType - тип по умолчанию. Он связывает контекст с текущим потоком, довольно часто основной поток кстати. Вы не должны полагаться на тип по умолчанию, но в простейших приложениях. NSMainQueueConcurrencyType и NSPrivateQueueConcurrencyType являются лучшими, поскольку вы точно знаете, какая очередь используется для каждого контекста.