Базовые данные только с одним контекстом данных. Это правильно? - PullRequest
2 голосов
/ 06 января 2011

Я пытаюсь сделать свое первое приложение с использованием Objective C + Core Data, но я не уверен, что это правильный путь, так как мне это кажется странным.

  • У меня есть только один контекст данных, который я создаю во время запуска, в делегате приложения. Этот контекст данных используется для всех операций (чтение, запись). В другой среде (например, C # и LINQ) я стараюсь сделать эти операции как можно более унитарными. Здесь, кажется, мне просто нужно создать контекст данных один раз и работать с ним, не закрывая его никогда (кроме случаев, когда приложение завершается).

  • У меня также есть асинхронная операция, в которой я обновляю эти данные. Конечно, он снова использует тот же контекст данных. Это работает, но не чувствует себя хорошо.

  • My Application Delegate хранит NSArray объектов, содержащихся в Базовых данных. Я использую этот же NSArray во всех своих представлениях.

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

Как вы можете заметить, я кое-что здесь упускаю :) Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 06 января 2011

NSManagedObjectContext, на который вы ссылаетесь, является скорее «блокнотом», чем подключением к базе данных.Объекты создаются, изменяются, уничтожаются в этой рабочей области и сохраняются («записываются в базу данных», если вы предпочитаете), когда вы указываете MOC сохранить состояние.Вы можете (и должны) init и release MOC, если вы работаете в отдельных потоках, но App Delegate делает MOC доступным, чтобы весь код, выполняемый в основном потоке, мог использовать один и тот же контекст.Это удобно и избавляет от необходимости обеспечивать синхронизацию нескольких MOC друг с другом.

Сохраняя NSArray объектов Core Data, вы фактически дублируете его функциональные возможности.Есть ли какая-либо причина не работать с NSSet объектов базовых данных, предоставляемых MOC?

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

Существует хорошее руководство / описание по использованию Core Data в нескольких потоках.здесь: http://www.duckrowing.com/2010/03/11/using-core-data-on-multiple-threads/

0 голосов
/ 25 июля 2012

1) ОСНОВНЫЕ ДАННЫЕ И НИТИ, БЕЗ ГОЛОВНОЙ http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

2) Параллелизм с базовыми данными http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html

3) Multi-Context CoreData http://www.cocoanetics.com/2012/07/multi-context-coredata/

...