Шаблон контекста? Зачем это нужно Core Data? - PullRequest
5 голосов
/ 24 июня 2011

Я все еще довольно новичок в Core Data и пытаюсь понять, почему он требует передачи NSManagedObjectContext. Насколько я понимаю, передача контекста необходима для того, чтобы несколько потоков не влияли на один и тот же контекст, но у меня также сложилось впечатление, что этот паттерн иногда считается антипаттерном, как отмечалось здесь .

Могут ли теоретически основные данные быть реализованы потокобезопасным способом, чтобы избежать использования этого шаблона? Как другие ORM (например, ActiveRecord в Ruby) избегают этого паттерна? Например, CoreData не может реализовать метод сохранения для каждого NSManagedObject, например, в этом расширении . Эта легкая структура не обрабатывает многопоточность, но не могут ли NSManagedObject использовать какие-то внутренние очереди GCD для ее поддержки, с внутренним контекстом, который они не предоставляют?

Извините, если я что-то пропустил.

Ответы [ 2 ]

5 голосов
/ 25 июня 2011

NSManagedObjectContext - это контейнер в памяти графа объектов вашего приложения, так же как постоянное хранилище (XML, SQLite и т. Д.) Обычно представляет контейнер на диске вашего графа объектов.

У этого подхода есть некоторые преимущества:

  1. Неисправность может быть применена к набору объектов или, в случае CoreData, к графу всего объекта
  2. Это удобная абстракция для принудительного выполнения приложением пакета операций ввода-вывода.
  3. Предоставляет единую точку контакта для эффективного выполнения операций над всем графом объектов (NSFetchRequests и т. Д.)
  4. Отмена может применяться к графу объектов, а не только к отдельным объектам.

Также важно помнить, что CoreData не является платформой ORM, это каркас персистентности объектов. Основная ответственность CoreData - сделать доступ к данным, хранящимся в постоянном формате на диске, более эффективным. Однако он не пытается эмулировать функциональность реляционных баз данных.

К вашему мнению о параллелизме, новые модели параллелизма были введены в предстоящем выпуске Mac OSX. Вы можете прочитать больше об этом на developer.apple.com.

В абстрактной модели модель параллелизма, выбранная для контекста управляемого объекта, больше связана со спецификой отдельного приложения, чем с самим шаблоном контекста. Экземпляры NSManagedObjectContext, как правило, никогда не должны совместно использоваться потоками.

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

Это гораздо более эффективная парадигма, чем возможность отдельного контекста непрерывно потреблять системные ресурсы в течение жизненного цикла данного приложения. Конечно, это можно сделать, вызвав -reset также и для контекста, что приведет к тому, что все NSManagedObject, используемые контекстом, будут возвращены к ошибкам.

0 голосов
/ 24 июня 2011

Вам нужен один NSManagedObjectContext на поток.Таким образом, у вас будет один для заполнения вашего пользовательского интерфейса в основном потоке, а для более длительных операций у вас будет другой для каждого фонового потока.Если вы хотите, чтобы результаты были объединены из этих других потоков, есть уведомление, на которое вы можете подписаться, которое предоставляет что-то для быстрого объединения того, что было изменено в вашем основном MOC.

...