Core Data падает при установке связи между объектами из разных контекстов
Note создаётся в главном контексте, а Category был получен в фоновом контексте. Присваивание связи падает: Illegal attempt to establish a relationship 'category' between objects in different contexts.
Ограничения:
- Оставьте
Noteв главном контексте. - Не отключайте валидацию Core Data и не добавляйте второе хранилище.
let note = Note(context: mainContext)
note.title = "Draft"
// `category` был получен ранее в фоновом контексте
note.category = category // ❌ падает: объекты в разных контекстах
try mainContext.save()
Найдите и исправьте ошибку.
Связь Core Data соединяет только два NSManagedObject из одного контекста. Здесь note в главном контексте, а category получен в фоновом, поэтому note.category = category падает. Исправление — заново получить category в главном контексте по его objectID и там установить связь.
- ✗Устанавливают связь между двумя разными
NSManagedObjectContext - ✗Думают, что это проблема потоков, решаемая одним переходом на очередь
- ✗Используют KVC в обход проверки контекста вместо переноса через
objectID
- →Почему
objectIDбезопасно передавать между контекстами, а сам объект нет? - →Когда здесь стоит взять
object(with:)вместоexistingObject(with:)?
Связь может соединять только объекты одного контекста. Перенесите category в главный контекст по его objectID и уже там установите связь:
let note = Note(context: mainContext)
note.title = "Draft"
let categoryID = category.objectID // потокобезопасный идентификатор
let localCategory = try mainContext.existingObject(with: categoryID) as! Category
note.category = localCategory // оба объекта теперь в mainContext
try mainContext.save()
objectID безопасно пересекает границы контекстов, тогда как сам NSManagedObject привязан к своему контексту и его очереди. Если category живёт в фоновом контексте, выполняйте перенос и присваивание внутри mainContext.perform { … }.