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