Основные ошибки данных против исключений, часть 3 - PullRequest
0 голосов
/ 16 апреля 2010

Мой вопрос похож на этот .

Фон

Я создаю большое количество объектов в основном хранилище данных, используя NSOperations, чтобы ускорить процесс.

Я следовал всем правилам многопоточности Core Data - у меня есть один постоянный координатор хранилища и контекст управляемого объекта на поток, который при сохранении сливается с основным контекстом управляемого объекта.

Проблема

Когда количество одновременно работающих потоков превышает 1, при сохранении моего основного хранилища данных регистрируется исключение:

NSExceptionHandler has recorded the following exception:
NSInternalInconsistencyException -- optimistic locking failure

Что я пробовал

Мой код, который создает новые сущности, довольно сложен - он делает сущности, имеющие отношения с другими сущностями, которые могут быть созданы в отдельном потоке.

Если я заменю свою подпрограмму создания объекта каким-нибудь очень простым кодом, просто делая несвязанные записи, все будет отлично работать.

Изначально, как и исключения, я получал ошибку сохранения, сообщающую, что данные ядра не могут быть сохранены из-за сбоя объединения.

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

Мой вопрос

Нужно ли беспокоиться об этих исключениях? Если мне нужно избавиться от исключений, есть какие-нибудь идеи о том, как мне это сделать?

Ответы [ 2 ]

1 голос
/ 16 апреля 2010

Вам необходимо перехватить это исключение, а затем распечатать всю информацию, связанную с ним, чтобы определить точную причину. Исключения в Базовых данных довольно редки, и их НИКОГДА не следует игнорировать.

Однако вы не предоставили нам достаточно информации, чтобы помочь отследить ее, поэтому первым делом необходимо развернуть это исключение и посмотреть, что происходит.

1 голос
/ 16 апреля 2010

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

Вы создаете новый NSManagedObjectContext для новой темы? В Apple doc Многопоточность с базовыми данными приведены рекомендации по многопоточности с базовыми данными. Он рекомендует:

Создать отдельный управляемый объект контекст для каждого потока и поделиться один постоянный координатор магазина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...