Intereting Posts

Удаление объекта CoreData и обратных связей

У меня есть объект (A), который имеет отношение To-Many к другому объекту (B). Кроме того, B имеет обратную связь с A.

Когда я удаляю B, он все еще отображается на счету отношения отношения A, если только я вручную не очищаю обратную связь B перед удалением. Я хочу, чтобы это произошло синхронно, поэтому я мог обновить UITableView и удалить строку B, вместо того, чтобы ждать завершения действия сохранения MOC.

Есть ли способ справиться с этим без ручной очистки инверсии B? (У меня есть тонны этих отношений, и это было бы плохой практикой и трудно поддерживать)

Благодаря!

Это должно работать автоматически, если вы установите «Удалить правило» для обратной связи от B до A до «Nullify» в инспекторе модели данных ядра в Xcode.

Дополнительные сведения см. В разделе « Правила удаления связей» в «Руководстве по программированию основных данных».

Почти 5 лет спустя (в IOS 10 сейчас), и я наткнулся на ту же проблему.

Приложение начало сбой после того, как я решил «оптимизировать» вещи, удалив saveContext() почти всюду, считая, что представление в памяти гарантировано правильно (поскольку true по умолчанию true ).

Однако я описывал эту проблему (и потому, что позже UITableView необходимо было обновить, приложение сбой).

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

  • вызов processPendingChanges()NSManagedObjectContext ) после удаления
  • вызов refreshAllObjects()NSManagedObjectContext ) после удаления
  • вызов saveContext() после удаления (как указывали другие в комментариях)
  • просто жду. например, задержка выполнения кода, который зависит от правильных данных на 0,1 секунды или около того (с помощью DispatchQueue.main.asyncAfter ). (это, безусловно, самый худший подход, и вы не должны его реализовывать)

Вещи, о которых я до сих пор не уверен:

  • Я попытался воспроизвести его на отдельном очень маленьком примере проекта, и я не понял. Итак, какова основная проблема?
  • Это ожидаемое поведение или ошибка? Документировано ли это где угодно?