【问题标题】:Core Data prevent saving核心数据阻止保存
【发布时间】:2020-05-02 02:08:02
【问题描述】:

有没有办法防止根据特定条件保存特定的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


【解决方案1】:

我知道您提到您不想使用不同的上下文,但使用不同的上下文确实是最好的方法。

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

let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

childContext.parent = YOUR_MAIN_THREAD_CONTEXT

你现在使用这个子上下文创建你的NSManagedObject,如果用户没有完成就离开了,那么只需将此上下文设置为 nil 就可以了。

如果你想提交它,然后保存子上下文,将它推送到 ma​​in,然后保存主上下文以推送到持久存储

func commitContext(childContext: NSManagedObjectContext?) {

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

【讨论】:

  • 嗨,吉姆,感谢您的评论。这看起来是一个很好的解决方案,但是,表单与主上下文中的另一个对象有关系。如果我更改表单的上下文,我将不得不更改相关对象及其相关对象的上下文等等......
  • 嗨@Sam,np。我明白了,从最初的描述中可以理解,它总是有更多内容。祝你最终的解决方案好运。
  • 为了使用另一个与我在子上下文中的对象有关系的对象,我找到了这个解决方案:childContext.object(with: RelatedObj.objectID) as! RelatedObj。所以我能够在子上下文中获取另一个对象,然后将两个对象链接在一起。谢谢您的帮助。它真的帮助了我!
【解决方案2】:

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

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

override public func willSave() {

    if self.name != nil {
       try? context.save()
    }
    else {
       context.rollback()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2017-10-14
    • 2011-04-16
    相关资源
    最近更新 更多