Как передать объект Core Data из одного NSManagedObjectContext в другой?

«Как передать объект Core Data из одного NSManagedObjectContext в другой?» — вопрос из категории Базы данных, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Передавать нужно не сам объект, а его идентификатор (NSManagedObjectID), который является постоянным и безопасным для использования между контекстами.

Основные способы передачи:

  1. Использование NSManagedObjectID (рекомендуемый способ):

    // В исходном контексте
    let objectID = managedObject.objectID
    
    // В целевом контексте
    targetContext.perform {
        let objectInTargetContext = targetContext.object(with: objectID)
        // Теперь можно безопасно использовать объект
    }
  2. Иерархия контекстов (Parent-Child):

    • Дочерний контекст (childContext) работает с собственным стеком.
    • При сохранении (save()) изменения автоматически переносятся в родительский контекст (parentContext).
    • Объекты можно безопасно передавать между контекстами в одной иерархии, используя их objectID.
  3. Синхронизация через уведомления (для независимых контекстов):

    // Подписка на уведомление о сохранении исходного контекста
    NotificationCenter.default.addObserver(
        forName: .NSManagedObjectContextDidSave,
        object: sourceContext,
        queue: nil
    ) { notification in
        // Слияние изменений в целевой контекст
        targetContext.perform {
            targetContext.mergeChanges(fromContextDidSave: notification)
        }
    }

Важное правило: Никогда не передавайте экземпляр NSManagedObject между потоками или контекстами напрямую. Это приведет к ошибкам многопоточности и нестабильности. Всегда работайте через objectID или механизмы слияния (mergeChanges).