1

У меня есть отношение «один-много» между двумя основными объектами данных.Проверка отношения к CoreData Ошибка Обработка ошибок

Как ниже - >> B

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

B -> A: Отменяет

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

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

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

+0

вы все равно можете отслеживать, что происходит в других контекстах с помощью 'mergeChangesFromContextDidSaveNotification' –

ответ

0

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

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

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

Смежные вопросы