Похоже, что в ноябре Apple обновила документы NSManagedObjectContext Class Reference и Руководство по программированию основных данных , чтобы явно благословить последовательные очереди отправки GCD и NSOperationQueues в качестве приемлемых механизмов для синхронизации доступа к NSManagedObjectContext
. Но их совет кажется двусмысленным и, возможно, противоречивым, и я хочу убедиться, что правильно его понял.
Ранее казалось, что к NSManagedObjectContext
можно получить доступ только из потока, который его создал, и что использования последовательной очереди для синхронизации недостаточно; хотя последовательные очереди выполняют только одну операцию за раз, эти операции потенциально могут быть запланированы для разных потоков, а MOC это не нравится.
Но теперь из руководства по программированию у нас есть:
Вы можете использовать потоки, очереди последовательных операций или очереди отправки для параллелизма. Для краткости в этой статье используется термин «нить» для обозначения любого из них.
Пока все хорошо (хотя их объединение потоков и очередей бесполезно).Так что я могу безопасно использовать один контекст для каждой (последовательной) очереди вместо одного контекста на операцию / блок, верно? Apple даже наглядно демонстрирует это в сессиях Core Data WWDC.
Но ... где вы создаете контекст для очереди? В документации NSManagedObjectContext
Apple заявляет:
[Контекст] предполагает, что владельцем по умолчанию является поток или очередь, которая его распределила - это определяется потоком, который вызывает его метод инициализации. Поэтому не следует инициализировать контекст в одном потоке, а затем передавать его другому потоку.
Итак, теперь у нас есть идея NSManagedObjectContext
, которому необходимо знать, кто его владелец. Я предполагаю, что это означает, что первая операция, которая будет выполнена в очереди, должна создать MOC и сохранить ссылку на него для использования оставшимися операциями.
Это правильно? Единственная причина, по которой я сомневаюсь, заключается в том, что в статье NSManagedObjectContext
говорится:
Вместо этого вы должны передать ссылку на постоянный координатор хранилища и заставить принимающий поток / очередь создать новый производный контекст. От этого. Если вы используете NSOperation, вы должны создать контекст в главном (для последовательной очереди) или стартовом (для параллельной очереди).
Apple теперь, похоже, объединяет операции с очередями, которые планируют их выполнение. Это заставляет меня задуматься, действительно ли они хотят, чтобы вы просто создавали новый MOC для каждой операции в конце концов.Что мне не хватает?