我已将NSManagedObject
对象复制到临时NSManagedObject
对象中。因此,如果用户输入没有变化,我可以使用该临时NSManagedObject
对象。否则,我可以使用实际的NSManagedObject
对象。
问题是,如果我更改实际NSManagedObject
对象中的任何值,它会自动反映在临时NSManagedObject
对象中。当我在网上搜索时,他们说NSManagedObject
不符合NSCopying
协议。此外,复制的对象将引用实际的NSManagedObject
对象。
有没有办法克服这个问题?
答案 0 :(得分:1)
我认为知道你为什么需要'会很有帮助。临时NSManagedObject
。
像NSManagedObject
这样的类是引用类型。这意味着原始对象和临时对象都在内存中引用相同的地址,对一个地址的更改将反映在另一个地址中。
但是,结构是值类型。也许您可以创建一个可以使用托管对象初始化的结构,并使用它来存储临时需要保存的任何数据。
另外,具体到NSManagedObject
s,其想法是 是临时的。更改托管对象的属性时,在将其写入具有托管对象上下文的持久性存储之前,它不会保留。
答案 1 :(得分:0)
嗯,严格说,是的,有。只需在托管对象上下文中创建该实体类型的新对象,并将所有属性逐个复制到新创建的对象中。
let objCopy = NSEntityDescription.insertNewObject(forEntityName:<#entityName#>, into:<#context#>)
objCopy.propertyA = objOrigin.propertyA
objCopy.propertyB = objOrigin.propertyB
...
但是在上下文中处理托管对象的前提对我来说有点模糊。 NSManagedObject只反映了一些实际数据的临时状态。因此,如果您需要撤消对对象所做的某些更改,您可以随时执行此操作。您可以询问托管对象上下文,哪些对象已更改,您可以向托管对象询问已更改的属性,您有undo()
方法等。
因此,您应该考虑检查您的应用程序设计。很确定,您不需要拥有对象的临时副本。
如果您的副本不是临时性的并且应该保存到持久存储中 - 您必须手动和属性地复制这些对象(查看我的答案的第一部分)。在这种应对的情况下,将有单独的挑战来决定,如何处理引用 - 复制引用的对象(深层复制),或只是继续引用与原始对象相同的对象