如何初始化新的NSManagedObject并在单个托管对象上下文中设置与另一个NSManagedObject的关系?

时间:2017-02-10 15:48:36

标签: swift core-data initialization nsmanagedobject nsmanagedobjectcontext

我正在创建一个新的NSManagedObject并尝试与另一个NSManagedObject建立关系但我收到此错误:

  

非法企图在对象之间建立关系“提升”   不同的背景

我知道为什么会这样 - 我只是不知道如何解决它。

我正在调用此函数来创建新对象:

func createNewLiftEvent() -> LiftEvent {
    let entity = NSEntityDescription.entityForName("LiftEvent", inManagedObjectContext: moc!)
    let newLiftEvent = LiftEvent(entity: entity!, insertIntoManagedObjectContext: moc)

    return newLiftEvent
}

我的LiftEvent实例在初始化时设置自己的值。在awakeFromInsert中,调用了三个辅助方法,它们使用一个名为LiftEventDataManager(dataManager)的类,这当然是创建我不想要的第二个managedObjectContext:

override func awakeFromInsert() {
    super.awakeFromInsert()

    let defaultUnit = getDefaultWeightUnit()  // returns an NSManagedObject
    self.weightUnit = defaultUnit

    let defaultLift = getDefaultLift() // returns an NSManagedObject
    self.lift = defaultLift

    let defaultFormula = getDefaultFormula() // returns an NSManagedObject
    self.formula = defaultFormula

    self.maxAmount = 0.0
}

这是其中一种辅助方法的示例:

func getDefaultFormula() -> Formula {
    let formulasArray = dataManager.fetchSelectableFormulas() // this is what creates a new managedObjectContext
    let defaultFormula = NSUserDefaults.formula().rawValue
    formula = formulasArray[defaultFormula]
    return formula
}

createNewLiftEvent()函数在LiftEventDataManager类中,以及上面辅助函数中调用的.fetchSelectableFormulas()方法等方法。

Apple的核心数据编程指南没有说明这个特定问题,我没有在SO上找到解决初始化时多个上下文问题的任何线程。

如何在“上下文A”中创建新的LiftEventObject并获取其他托管对象并将其置于“上下文A”中,以便我可以设置关系?

1 个答案:

答案 0 :(得分:0)

一个选项可能是传递你的原始LiftEvent对象并让你的帮助方法使用LifeEvent的managedObjectContext来做他们的事情(所有托管对象都有对它们的上下文的引用,所以你可以利用这个事实)。

(可能不适用,但仅供参考,如果线程发挥作用,请小心。您可能还需要使用performBlockAndWait)