0

Я использую два MOC, один для основного потока и другой MOC на фоновом потоке. В основном потоке у меня есть UITableView, работающий с FRC (NSFetchedResultsController).CoreData не может выполнить ошибку во время операции сохранения из фона. MOC

Время от времени я запускаю массивную операцию сохранения, которая удаляет все объекты и создает несколько сотен новых объектов ... В этот момент я хочу, чтобы UITableView в основном потоке обновлял свои данные (используя FRC, очевидно,). Поэтому основной MOC регистрируется в уведомлении NSManagedObjectContextDidSaveNotification (полученном из фонового MOC) и запускает mergeChangesFromContextDidSaveNotification на этом этапе, чтобы убедиться, что UITableView обновляется соответствующим образом.

Все это работает нормально, пока я не попробую прокрутить UITableView во время операции сохранения. Когда я пытаюсь прокрутить представление, исключение «coredata не может выполнить ошибку». Это результат того, что FRC все еще удерживает объекты, которые уже были удалены (пока операция сохранения все еще выполняется, до того, как mergeChangesFromContextDidSaveNotification из уведомления NSManagedObjectContextDidSaveNotification будет получена на основном MOC). Это какое-то «условие гонки» между операцией сохранения и обновлением UITableView после получения mergeChangesFromContextDidSaveNotification.

Каков правильный подход к работе с этими двумя MOC и забота о FRC, чтобы он смог справиться с этим сценарием?

ответ

0

По apples doc:

неисправностей не могут быть выполнены Проблема: Вы видите сообщение об ошибке, «Core данных не может выполнить ошибку».

Причина: Исходные данные соответствующего объекта были удалены из постоянного хранилища.

Устранение: вы должны отказаться от этого объекта.

Эта проблема может возникнуть, по крайней мере в двух случаях:

Первое:

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

Попробуйте восстановить атрибут или связь с ранее сохраненной ссылкой . Core Data попытается устранить неисправный управляемый объект , но не сможет этого сделать, потому что объект был удален из магазина . То есть больше нет объекта с тем же глобальным ID в магазине.

Второе:

Удаление объекта из контекста управляемого объекта. Невозможно разорвать все отношения от других объектов к этому объекту. Сохранить изменения.

+0

Спасибо. Я прочитал этот пост ... Каков наилучший способ рассмотрения архитектуры и сценария, которые я описал, чтобы «отказаться от этого объекта»? – Joel

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

  • Нет связанных вопросов^_^