CoreData Relationship Validation Обработка ошибок

У меня есть отношения "один ко многим" между двумя основными объектами данных.

Как показано ниже A - >> B

A - >> B: Удалить запретить (т.е. запретить удаление A, пока они являются объектами B)

B -> A: обнулить

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

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

Есть ли вариант, как я могу справиться с ошибкой проверки. NSValidationRelationshipDeniedDeleteError


person user3519594    schedule 14.11.2016    source источник
comment
вы по-прежнему можете отслеживать, что происходит в других контекстах, с помощью mergeChangesFromContextDidSaveNotification   -  person Erik Johansson    schedule 14.11.2016


Ответы (1)


Я не нашел способа отменить удаление только для определенного объекта без потери изменений. Таким образом, если вы удалили родительский объект в childContext, а затем сохранили childContext, удаленный объект автоматически добавляется в parentContext.deletedObjects. Я пробовал разные подходы, но единственный способ отменить операцию удаления из parentContext - это вызвать parentContext.refreshObject(deletedParent, mergeChanges: false). (наверняка можно попробовать откатить или сбросить контекст)

Это действительно зависит от того, что вы собираетесь делать (так что здесь большое влияние оказывает бизнес!). Но я думаю, вам следует работать оптимистично: https://en.wikipedia.org/wiki/Optimistic_concurrency_control Иногда в случае конфликтов можно откатить и перезапустить транзакции.

Обычно childContext отменяет изменения parentContext (дочерний элемент имеет более высокий приоритет). Таким образом, архитектура вашего приложения должна работать точно так же. Когда вы удаляете объект в childContext, вы также должны удалить его в parentContext, даже если правило запрета останавливает вас, потому что вы вставили новый дочерний объект. Что вам нужно сделать, так это удалить вставленные объекты, а затем удалить родительский объект. В противном случае вам следует заново изучить архитектуру приложения.

person ELKA    schedule 14.11.2016