[Предупреждение: этот ответ в большей степени относится к обновленному коду CoreDataBooks, который был изменен для использования нового метода setParentContext в iOS5 NSManagedObjectContext вместо того, чтобы связываться с persistentStoreCoordinator [
На ваш второй вопрос об обмене данными также отвечает модальный подход Add vs modeless Edit. Запустите приложение в симуляторе и обратите внимание, что:
, если вы нажмете Добавить, в вашем следующем окне есть кнопки Сохранить и Отменить
, если вы нажмете на Изменить, у вашего следующего вида есть только кнопка Готово.
(Теперь, в этом конкретном проекте, вы должны редактировать каждое поле за раз, и редактирование поля выполняется в еще одном представлении, и у этого есть кнопка Отмена, но пока игнорируйте это, потому что
а. это относится только к области. Например. Если вы отредактируете заголовок и нажмете кнопку «Сохранить», вы вернетесь к представлению «Изменить» с кнопкой «Готово», теперь нет отмены, чтобы отменить это изменение, вы можете нажать только «Готово». Что касается этого представления, вы отредактировали режим BookLESSly
б. Какой хромой интерфейс! Заходите в Apple, превратите CoreDataBooks в приличное, хотя и простое приложение, соответствующее вашим собственным правилам. По крайней мере поместите редактирование в ячейки
Где мы были? О да, «Редактировать» - у существующей Книги есть modeLESS, поэтому она передает исходную Книгу в том же MOC (NSManagedObjectContext), и вы не можете отменить свои изменения в ней в представлении «Редактировать».
«Добавить» - книгу, с другой стороны, это MODAL: она создает новую книгу для редактирования в подробном представлении и хочет отменить ее, если пользователь нажимает кнопку отмены. Для достижения этого он должен использовать второй MOC, который является потомком первого. Если пользователь отменяет, он просто игнорирует новый дочерний MOC, фактически отбрасывая новую книгу; если пользователь сохраняет, он сохраняет дочерний MOC, который помещает новую книгу и ее свойства в родительский MOC, а затем сохраняет родительский MOC.
Этот подход «ребенок-МОК», кстати, подробно описан в презентации 303 WWDC 2011 «Что нового в Базовых данных на iOS».
Есть и другие подходы, обсуждаемые в других местах SO, включая
Создание нового управляемого объекта с нулевым MOC и вставка его в родительский MOC только при нажатии пользователем кнопки save
Не используется управляемый объект, но другая структура данных для временного объекта (новая книга, в которой мы пока не уверены, что мы хотим сохранить), например NSDictionary, или просто набор различных переменных
и более ...?
Я предпочитаю подход родитель-потомок, потому что Apple отдает ему предпочтение и потому, что он использует объекты модели данных вместо создания параллельных структур данных для временных объектов.
Подход с нулевым контекстом также имеет это преимущество и дополнительное преимущество (по-видимому) лучшей производительности и простоты (читай мне: никаких новых MOC). Но я не уверен, что управляемые объекты без контекстов управляемых объектов являются кошерными.
Кстати, CoreDataBooks не совсем соответствует соглашению, изложенному в вышеупомянутой презентации, поскольку не сохраняет контекст parent в блоке executeBlock.
Также я не уверен, почему он устанавливает новый управляемый контекст как свойство в AddViewController и не использует его.