Ios 摆脱临时保存的managedObjectContext

Ios 摆脱临时保存的managedObjectContext,ios,core-data,swift,nsmanagedobject,nsmanagedobjectcontext,Ios,Core Data,Swift,Nsmanagedobject,Nsmanagedobjectcontext,如何管理临时保存的CoreData? 一旦我做了这样的事情: var myClass: MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!) as MyClass 它是我的managedObj

如何管理临时保存的CoreData? 一旦我做了这样的事情:

var myClass: MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!) as MyClass
它是我的managedObjectContext的一部分,当我执行
context.save(nil)
是否有任何方法可以在不干扰当前上下文的情况下获取NSManagedObject类的对象。
换句话说:我希望有一些可选的对象,当我不显式保存它们时,这些对象就不用了,我希望有一些我真正想持久保存的对象。

没有直接的方法可以摆脱更新的对象。你可以做的是用真实数据(更新之前的数据)再次更新它。每当您更新“NSManagedObject”(核心数据实体对象)的对象时,“NSManagedObjectContext”将捕获所有更改,并在您保存上下文时进行保存


在这种类型的用例中,最好使用Sqlite数据库

没有直接的方法可以摆脱更新后的对象,您可以做的是用真实数据(更新前的数据)再次更新它。每当您更新“NSManagedObject”(核心数据实体对象)的对象时,“NSManagedObjectContext”将捕获所有更改,并在您保存上下文时进行保存


在这种类型的用例中,最好使用Sqlite数据库

在调用
context.save
之前,可以从托管上下文中删除对象,这会阻止提交对象。假设您有一个名为
NSManagedObjectContext
NSManagedObjectContext
和一个名为
MyClass
MyClass
实例,则以下操作将起作用:

context.deleteObject(myClass)

见:

讨论

。。。如果对象尚未保存到持久性存储,则只需将其从接收器中删除

当然,关于保存哪些对象和放弃哪些对象的决定取决于应用程序的逻辑。因此,在调用save之前,您需要检查所有已插入但尚未提交的实例,这些实例已注册到您正在使用的NSManagedObjectContext中。您可以在应用程序中跟踪这一点,或者这将很有用:

已插入接收器但尚未保存在持久存储中的对象集。(只读)


您可以在调用
context.save
之前从托管上下文中删除对象,这将阻止提交对象。假设您有一个名为
NSManagedObjectContext
NSManagedObjectContext
和一个名为
MyClass
MyClass
实例,则以下操作将起作用:

context.deleteObject(myClass)

见:

讨论

。。。如果对象尚未保存到持久性存储,则只需将其从接收器中删除

当然,关于保存哪些对象和放弃哪些对象的决定取决于应用程序的逻辑。因此,在调用save之前,您需要检查所有已插入但尚未提交的实例,这些实例已注册到您正在使用的NSManagedObjectContext中。您可以在应用程序中跟踪这一点,或者这将很有用:

已插入接收器但尚未保存在持久存储中的对象集。(只读)


这个答案已经晚了,但希望能帮助其他人有。您可以创建一个子上下文。你想在那里做什么都行。如果 如果要保留更改,请保存子上下文-它不会持久化数据。它将更改通知父上下文,这些更改现在位于主上下文中。然后可以在主上下文上执行保存

    let childContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    childContext.parentContext = mainContext
    guard let myClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: childContext) as? MyClass else {
        // something went wrong, handle it here
        return
    }
    // do your thing here
要让主上下文知道您希望保留更改,请执行以下操作:

    do {
        try childContext.save()  // does not persist anything, just lets know the parent that we are happy with the changes
    } catch {
        // handle error
    }
如果不想保留更改,可以重置:

    childContext.reset()
当您希望在主上下文上持久化更改时,您将一如既往地执行以下操作:

    do {
         try mainContext.save()
    } catch {
         // handle error
    }

这个答案已经晚了,但希望能帮助其他人有。您可以创建一个子上下文。你想在那里做什么都行。如果 如果要保留更改,请保存子上下文-它不会持久化数据。它将更改通知父上下文,这些更改现在位于主上下文中。然后可以在主上下文上执行保存

    let childContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    childContext.parentContext = mainContext
    guard let myClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: childContext) as? MyClass else {
        // something went wrong, handle it here
        return
    }
    // do your thing here
要让主上下文知道您希望保留更改,请执行以下操作:

    do {
        try childContext.save()  // does not persist anything, just lets know the parent that we are happy with the changes
    } catch {
        // handle error
    }
如果不想保留更改,可以重置:

    childContext.reset()
当您希望在主上下文上持久化更改时,您将一如既往地执行以下操作:

    do {
         try mainContext.save()
    } catch {
         // handle error
    }

谢谢你的回答!“使用真实数据再次更新”的确切含义是什么?当您不想保存数据时,不要保存上下文,但如果您想保存上下文,因为您可能已经创建了新实体。但在保存上下文之前,请使用原始数据(真实数据)更新更新的对象。但如何更新对象?你是什么意思?谢谢你的回答!“使用真实数据再次更新”的确切含义是什么?当您不想保存数据时,不要保存上下文,但如果您想保存上下文,因为您可能已经创建了新实体。但在保存上下文之前,请使用原始数据(真实数据)更新更新的对象。但如何更新对象?你是什么意思?非常感谢你。。。如我所需的准确答案。非常感谢你。。。我需要的确切答案。