【问题标题】:Copy NSManagedObject into a temporary NSManagedObject in Swift将 NSManagedObject 复制到 Swift 中的临时 NSManagedObject
【发布时间】:2017-09-08 15:00:25
【问题描述】:
我已将NSManagedObject 对象复制到临时NSManagedObject 对象中。这样我就可以使用那个临时的 NSManagedObject 对象,如果用户输入没有变化的话。否则,我可以使用实际的 NSManagedObject 对象。
问题是,如果我更改实际 NSManagedObject 对象中的任何值,它会自动反映在临时 NSManagedObject 对象中。我在网上搜索时,他们说NSManagedObject 不符合NSCopying 协议。此外,复制的对象将引用实际的 NSManagedObject 对象。
有没有办法解决这个问题?
【问题讨论】:
标签:
ios
swift
core-data
nsmanagedobject
【解决方案1】:
我认为了解您“需要”临时NSManagedObject 的原因会很有帮助。
NSManagedObject 之类的类属于引用类型。这意味着您的原始对象和临时对象都引用内存中的相同地址,并且对其中一个地址的更改将反映在另一个中。
但是,结构是值类型。也许您可以创建一个结构,您可以使用托管对象对其进行初始化,并使用它来存储您需要临时保存的任何数据。
此外,特定于NSManagedObjects,其想法是它们是临时的。当您更改托管对象的属性时,它不会持久化,直到您将其与托管对象上下文一起写入持久存储。
【解决方案2】:
嗯,严格来说,是的,有。只需在托管对象上下文中创建该实体类型的新对象,然后将所有属性一一复制到新创建的对象中。
let objCopy = NSEntityDescription.insertNewObject(forEntityName:<#entityName#>, into:<#context#>)
objCopy.propertyA = objOrigin.propertyA
objCopy.propertyB = objOrigin.propertyB
...
但在上下文中处理托管对象的前提对我来说有点模糊。 NSManagedObject 仅反映实际数据的一些临时状态。因此,如果您需要撤消对对象所做的某些更改,您可以随时执行此操作。您可以询问托管对象上下文、哪些对象发生了变化、您可以询问托管对象有关已更改的属性、您有undo() 方法等。
因此,您应该考虑审查您的应用程序设计。很确定,您不需要拥有对象的临时副本。
如果您的副本不是临时性的并且应该保存到持久存储中 - 您必须手动复制这些对象并按属性进行复制(请看我回答的第一部分)。在这种应对的情况下,将有单独的挑战来决定如何处理引用 - 复制引用的对象(深拷贝),或者只是继续引用与原始对象相同的对象