Во-первых, некоторые предварительные условия:
Если вы создаете приложение, использующее базовые данные, то вы , скорее всего, столкнетесь с ситуациями, когда вам потребуется иметь более одного контекста управляемого объекта (MOC). Однако вам потребуется один MOC, который будет «жить» на протяжении всего сеанса приложения. Назовите это своим основным MOC (поскольку вы будете получать к нему доступ только из основного потока !!).
В более редких случаях, в зависимости от вашего приложения, вы также можете столкнуться с ситуациями, когда вам потребуется более одного NSPersistentStoreCoordinator. В своем ответе я буду придерживаться случая, когда требуется один координатор. Что касается вашего NSManagedObjectModel, это полностью зависит от вашего приложения. Обычно вам нужен только один из них.
Чтобы ответить на ваши вопросы:
Я предлагаю, чтобы ваш основной MOC принадлежал AppDelegate, поскольку последний является единственным, который живет до тех пор, пока работает приложение. Вы можете поместить методы для создания / сохранения основного MOC в AppDelegate или делегировать эти задачи служебному классу. Я нахожу второй вариант немного чище, поскольку вы можете использовать этот служебный класс для добавления методов, которые создают другие MOC на лету, или для получения ссылки на основной MOC из любого контроллера в вашем приложении. Таким образом, вы не будете вызывать AppDelegate постоянно.
Также обратите внимание, что если у вас уже есть NSManagedObject
в ваших руках, вы можете получить ссылку на MOC, в которой он зарегистрирован, просто позвонив по номеру [yourManagedObject managedObjectContext]
. Получив ссылку на MOC, вы можете получить соответствующие ссылки NSPersistentStoreCoordinator
и NSManagedObjectModel
. (Это ответ на ваш вопрос о «прохождении координатора»: я предпочитаю работать с NSManagedObject
s и NSManagedObjectContext
, поскольку они находятся на самом верхнем уровне абстракции, а не передают координатор или модель) .
Надеюсь, это поможет!