Должны ли контроллеры знать NSManagedObjectContext в приложении для iOS - PullRequest
2 голосов
/ 03 февраля 2012

В приложении для iOS, которое я реорганизую, я использую Core Data в качестве основного уровня сохраняемости. Я пытаюсь рефакторинг в сторону правильного шаблона MVC. Однако я пытался удалить объекты NSManagedObject * из пользовательского интерфейса, потому что я считаю, что именно модели должны заботиться о слое постоянства.

Я изо всех сил пытаюсь решить, так или иначе, разрешить ли пользовательскому интерфейсу сохранять NSManagedObjectContext или если модели должны поддерживать контекст для извлечения информации, запрошенной пользовательским интерфейсом, а затем вернуть тупой объект (не NSManagedObject) для пользовательского интерфейса. С моим опытом я склонен к тому, чтобы модели знали обо всей настойчивости, чтобы разделить проблемы, но я также изо всех сил пытаюсь оправдать эту модель.

Может ли кто-нибудь помочь мне понять, что я должен делать и почему?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2012

После долгих раздумий, чтения и других проверок я решил, что для контроллеров приемлемо знать контекст.Контекст можно более или менее использовать в качестве модели, и если логика представления не знает об этом, то это не нарушает MVC.

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

0 голосов
/ 04 февраля 2012

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

При сохранении информации в два отдельных NSManagedObjectContext вам необходимо объединить изменения в контексте других потоков, используя.

- (void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification

Суммировано из частей Руководства по программированию основных данных. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/CoreData.pdf

...