Мое приложение использует Core Data (с некоторой помощью Magical Record) и довольно многопоточно использует NSOperation
.
Конечно, я очень осторожен, чтобы обойти NSManagedObjectID
только между потоками/операциями.
Теперь, чтобы вернуться к соответствующему управляемому объекту в операции, я использую -existingObjectWithID:error:
таким образом:
Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error];
Но то, что я получаю, равно nil и error
говорит, что это ошибка # 13300: NSManagedObjectReferentialIntegrityError
.
Вот что говорит об этой ошибке документация:
NSManagedObjectReferentialIntegrityError
Error code to denote an attempt to fire a fault pointing to an object that does not exist.
The store is accessible, but the object corresponding to the fault cannot be found.
Что в моем случае неверно: этот объект существует. Действительно, если я повторяю все экземпляры этого объекта Collection
с NSFetchRequest
, я нахожу его среди них, а его NSManagedObjectID
- это тот, который я передал в -existingObjectWithID:error:
.
Кроме того, если я использую -objectWithID:
вместо этого, я верну правильный объект обратно.
Так что я чего-то не хватает. Вот несколько дополнительных наблюдений/вопросов:
- "объект, который не существует": что это значит "существует" в этом предложении? "существуют" где? Он определенно "существует" в моем хранилище основных данных в этот момент.
- "объект, соответствующий вине, не может быть найден": каково это значение "найдено" в этом предложении? "найдено" где? Это определенно "будет найдено" в моем хранилище основных данных в этот момент.
Так что, может быть, я что-то упустил, что делает existingObjectWithID:error:
? В документации указано:
If there is a managed object with the given ID already registered in the context, that object is returned directly; otherwise the corresponding object is faulted into the context.
[...]
Unlike objectWithID:, this method never returns a fault.
Это не помогает моей проблеме. Я не возражаю, чтобы мой объект был полностью виноват, а не ошибка. В самом деле, любая ошибка внутри него будет срабатывать в следующей строке кода, когда я получаю доступ к свойствам объекта.
- Что было бы реалистичным сценарием, ведущим к
NSManagedObjectReferentialIntegrityError
?
Спасибо за любое просвещение.