核心数据阻止保存

问题描述 投票:0回答:2

是否有一种方法可以防止根据特定条件保存特定的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()的操作,因此我不希望未完成时要保存的表格。

我不希望不在上下文中创建对象,然后在表单准备好后将其添加。我希望在上下文中创建表单。

提前感谢。

ios swift xcode core-data nsmanagedobject
2个回答
0
投票

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

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

let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

childContext.parent = YOUR_MAIN_THREAD_CONTEXT

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

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

func commitContext(childContext: NSManagedObjectContext?) {

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

0
投票

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

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

override public func willSave() {

    if self.name != nil {
       try? context.save()
    }
    else {
       context.rollback()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.