核心数据阻止保存

有没有一种方法可以防止根据特定条件保存特定的NSManagedObjectModel

我知道我们可以在保存之前使用willSave修改对象,但是有什么方法可以防止对象被保存?

override public func willSave() {

    if self.name != nil {

       // Save the object into context
    }
    else {
       // Don't save the object into context
    }
}

此请求的原因是用户应该能够启动表单并插入一些值,然后他还可以转到其他屏幕并执行其他可以触发context.save()的操作,而我不这样做不想保存表单。

我需要在上下文中创建该对象,因为该对象与上下文中的另一个对象有关系,如果我在上下文之外创建该对象,则需要更改所有关系的上下文。

谢谢。

shenjie63293713 回答:核心数据阻止保存

我了解您提到您不希望使用其他conext,但是使用不同的上下文确实是最好的方法。

如果您是在主上下文中创建的,即使没有保存,数据仍将处于“上下文”状态。分开是最安全的。 从您的主要上下文中创建子上下文...

let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

childContext.parent = YOUR_MAIN_THREAD_CONTEXT

您现在使用此子上下文创建NSManagedObject,如果用户未完成就离开,则只需将此上下文设置为nil即可。

如果要提交,则保存子上下文,将其推入 ,然后保存主上下文以推送到持久性存储

func commitContext(childContext: NSManagedObjectContext?) {

    do {
        try childContext?.save()
        do {
            try MainThreadMoc.save()
        } catch {
            print("Error saving parent context")
        }
    } catch {
        print("Error saving childContext")
    }
}
,

如果在显示表单时上下文没有未提交的更改,则可以使用rollback() API。它

从撤消堆栈中删除所有内容,放弃所有插入和删除操作,并将更新后的对象恢复为其上次提交的值。

override public func willSave() {

    if self.name != nil {
       try? context.save()
    }
    else {
       context.rollback()
    }
}
本文链接:https://www.f2er.com/2766094.html

大家都在问