Мое приложение использует Core Data (с некоторой помощью Magical Record) и довольно многопоточное, используя NSOperation
.
Конечно, я очень осторожен, чтобы пропустить NSManagedObjectID
только между потоками / операциями.
Теперь, чтобы вернуться к соответствующему управляемому объекту в операции, я использую -existingObjectWithID:error:
таким образом:
Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error];
Но я получаю ноль, и 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
?
Спасибо за любое просвещение.