CoreData + iCloud + Cascade Delete - как обращаться?

CoreData Entity "A" имеет отношение "один ко многим" к коллекции CoreData "В", используя правило Cascade delete.

В среде iCloud, в то время как устройство 1 показывает подробное представление одной из записей "B" , устройство 2 удаляет запись "A" .

Когда уведомление NSPersistentStoreDidImportUbiquitousContentChangesNotification принимается в устройстве 1, его делегат приложения вызывает mergeChangesFromContextDidSaveNotification, а затем транслирует внутреннее уведомление, которое захватывается контроллером представления, отображающим детали записи "B" (в коде используется performBlock где он должен).

Однако, хотя запись "A" действительно сбрасывается, когда контроллер подробного представления получает внутреннее уведомление, запись "B" все еще существует как действительный объект CoreData. Кажется, что правило Каскада еще не завершило свою работу. Поэтому контроллер вида в устройстве 1 не знает об удалении, что может привести к неожиданным результатам.

mergeChangesFromContextDidSaveNotification появляется преждевременно, когда базовые данные были объединены, но правило Cascade еще не завершено.

Я попытался обновить запись "B" , когда уведомление поступило, временно установив ноль stalenessInterval контекста управляемого объекта, чтобы кешированный объект не использовался, но я все еще получаю действительную запись "B" из магазин.

Проверка записи null "A" на данном этапе не является вариантом, потому что ситуация несколько сложнее, чем то, что я описал здесь, и в некоторых случаях допустимая допустимая ошибка "A" может быть действительной.

Я попытался ввести задержку после слияния изменений и перед отправкой внутреннего уведомления контроллерам представления. Я узнал, что 2-секундная задержка не помогает, но работает 10-секундная задержка.

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

Есть ли правильная вещь? Или я начинаю с чего-то не так?

Ответ 1

Из опыта, прослушивание уведомлений, отличных от NSManagedObjectContextDidSaveNotification, является большим беспорядком и может привести к использованию еще не обновленных свойств. Контроллер подробных представлений должен прослушивать уведомления NSManagedObjectContextDidSaveNotification, которые выбрасываются после применения каскада. Затем вы можете проверить несколькими способами, если текущий объект действителен или нет (вы можете проверить, соответствует ли контекст управляемого объекта объектам nil, или вы можете выполнить выборку и посмотреть, существует ли объект в хранилище).