Что имеет в виду Apple, когда они говорят, что NSManagedObjectContext принадлежит потоку или очереди, которые его создали?

Похоже, что в ноябре Apple обновила документы NSManagedObjectContext Class Reference и Руководство по программированию основных данных , чтобы явно благословить последовательные очереди отправки GCD и NSOperationQueues в качестве приемлемых механизмов для синхронизации доступа к NSManagedObjectContext . Но их совет кажется двусмысленным и, возможно, противоречивым, и я хочу убедиться, что правильно его понял.

Ранее казалось, что к NSManagedObjectContext можно получить доступ только из потока, который его создал, и что использования последовательной очереди для синхронизации недостаточно; хотя последовательные очереди выполняют только одну операцию за раз, эти операции потенциально могут быть запланированы для разных потоков, а MOC это не нравится.

Но теперь из руководства по программированию у нас есть:

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

Пока все хорошо (хотя их объединение потоков и очередей бесполезно).Так что я могу безопасно использовать один контекст для каждой (последовательной) очереди вместо одного контекста на операцию / блок, верно? Apple даже наглядно демонстрирует это в сессиях Core Data WWDC.

Но ... где вы создаете контекст для очереди? В документации NSManagedObjectContext Apple заявляет:

[Контекст] предполагает, что владельцем по умолчанию является поток или очередь, которая его распределила - это определяется потоком, который вызывает его метод инициализации. Поэтому не следует инициализировать контекст в одном потоке, а затем передавать его другому потоку.

Итак, теперь у нас есть идея NSManagedObjectContext , которому необходимо знать, кто его владелец. Я предполагаю, что это означает, что первая операция, которая будет выполнена в очереди, должна создать MOC и сохранить ссылку на него для использования оставшимися операциями.

Это правильно? Единственная причина, по которой я сомневаюсь, заключается в том, что в статье NSManagedObjectContext говорится:

Вместо этого вы должны передать ссылку на постоянный координатор хранилища и заставить принимающий поток / очередь создать новый производный контекст. От этого. Если вы используете NSOperation, вы должны создать контекст в главном (для последовательной очереди) или стартовом (для параллельной очереди).

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

61
задан Nick Hutchinson 26 January 2011 в 02:21
поделиться