CoreStore在上下文中创建对象而不保存到数据库

时间:2019-05-02 11:19:29

标签: ios swift core-data corestore

我要解决下一个问题:

我想在上下文中使用某些NSManagedObject并在运行时更改某些属性,但不告诉SQLite它有任何更改。

当我点击保存按钮或类似按钮时,我只想将NSManagedObject保存到数据库中。

正如我从源代码演示中发现的那样,我们需要为此使用beginUnsafe(也许我错了)

func unstoredWorkout() -> WorkoutEntity {

    let transaction = CoreStore.beginUnsafe()
    let workout = transaction.create(Into<WorkoutEntity>())

    return workout
}

let workout = unstoredWorkout()
workout.muscles = []

现在,当我尝试更新workout.muscles = []应用时因错误而崩溃:

error: Mutating a managed object 0x600003f68b60 <x-coredata://C00A3E74-AC3F-47FD-B656-CA0ECA02832F/WorkoutEntity/tC3921DAE-BA43-45CB-8271-079CC0E4821D82> (0x600001c2da90) after it has been removed from its context.

我的问题是如何在不保存对象的情况下创建对象,以及在修改某些属性并避免发生崩溃时如何保存对象。

1 个答案:

答案 0 :(得分:1)

崩溃的原因是您的事务仅存在于unstoredWorkout()方法中,因此它调用deinit,这会重置上下文(并删除所有未保存的对象)。 您必须将不安全的事务保留在某处,以使对象保持活动状态-例如在最终保存更改的ViewController中。

但是,如果您确实想这样做,我宁愿鼓励您考虑一下。在涉及各种上下文或其他异步事务的情况下,您可能会遇到其他同步问题,例如涉及API调用时。