Я использую метод отката контекста управляемого объекта для отказа от внесенных изменений, но у меня возникла проблема: Если у меня есть разные контроллеры представлений, и каждый из них может вносить изменения в разные данные базы данных и если первый контроллер выполняет метод отката, я не хочу, чтобы он откатывал изменения, внесенные вторым контроллером. Это в любом случае просто откат определенного объекта, но не все? или я должен использовать контексты управляемого объекта?ios core data roll back
ответ
Вы не можете отменить только частичный набор изменений NSManagedObjectContext
. Лучший способ сделать то, о чем вы говорите, - создать новый NSManagedObjectContext
, являющийся дочерним элементом родительского контекста. Когда вы его сохраняете, изменения переносятся на родителя (вы должны убедиться, что сохраните родительские контексты, чтобы на самом деле сохраняться на диске). Кроме того, если вы изолируете наборы изменений таким образом, вам даже не нужно вызывать rollback
в контексте для детей, вы можете просто выбросить их.
Обратите внимание, что использовать отношения родитель/потомок на NSManagedObjectContext
вы ОБЯЗАНЫ метода initWithConcurrencyType:
инициализировать все контексты, и вы должны указать либо NSPrivateQueueConcurrencyType
или NSMainQueueConcurrencyType
. Важно отметить, что это имеет последствия для доступа к контексту. Если вы не находитесь в главной очереди, используя контекст с типом параллелизма NSMainQueueConcurrencyType
, вам придется поместить все вызовы методов, которые взаимодействуют с контекстом внутри блока и передают его в контексты performBlock:
или performBlockAndWait:
.
Документация довольно тонкая на эту тему. Единственная ссылка, которую я могу найти за пределами видео WWDC, находится в this iOS 5 release notes document.
Это решение именно то, что я ищу. У меня все еще проблема. Скажем, если есть основной объект данных, полученный от первого контроллера, и он находится в родительском MOC. Позже второй контроллер нажат и хочет отредактировать объект в дочернем MOC. Как я должен переместить объект на второй MOC? Спасибо. – user2053760
Вам нужно будет переместить новый объект через родительский MOC. Если у вас есть дочерний MOC, и вы сохраняете изменения, они попадают к родителям. Если вы затем создадите еще один дочерний MOC этого же родителя, у него будет все, что было перенесено на родителя. Если у вас есть два дочерних MOC, которые существуют одновременно, вам может потребоваться повторно выбрать объекты во втором потомке после сохранения первого дочернего элемента. Вы сделали бы это, выполнив запрос на выборку еще раз, возможно, с свойством 'shouldRefreshRefetchedObjects', установленным в' YES'. –
Я имел в виду следующее: скажем, что объект A получен в контроллере A. И его MOC является первым, т. Е. ObjectA.MOC является MOC1. Затем я хочу сделать некоторые изменения этого объекта в контроллере B, но внутри MOC2. Я хочу сделать что-то вроде objectA.MOC = MOC2 (это невозможно сделать как .MOC только для чтения). Так есть ли способ назначить объект MOC2? потому что я не хочу, чтобы объект снова возвращался в MOC из таблиц базы данных, поскольку выбор мог возвращать много объектов, которые имеют одинаковое условие выбора. – user2053760