我已经将一个NSManagedObject对象复制到一个临时NSManagedObject对象中。这样,如果用户输入没有变化,我就可以使用临时NSManagedObject对象。否则,我可以使用实际的NSManagedObject对象。
问题是,如果我更改实际NSManagedObject对象中的任何值,它会自动反映在一个临时NSManagedObject对象中。当我在网上搜索时,他们说NSManagedObject不符合NSCopying协议。此外,复制的对象将引用实际的NSManagedObject对象。
有没有办法克服这个问题?
发布于 2017-09-08 23:14:32
我认为知道为什么你“需要”一个临时的NSManagedObject会很有帮助。
像NSManagedObject这样的类是引用类型。这意味着您的原始对象和临时对象都引用了内存中的相同地址,对其中一个对象的更改将反映在另一个对象中。
但是,结构是值类型。也许你可以创建一个结构,你可以用你的托管对象初始化它,并用它来存储你需要暂时保存的任何数据。
此外,具体到NSManagedObject,其想法是它们是临时的。当您更改托管对象的属性时,它不会持久化,直到您使用托管对象上下文将其写入持久性存储区。
发布于 2017-09-11 21:54:07
好吧,严格地说,是的,有。只需在托管对象上下文中创建实体类型新对象,并将所有属性逐个复制到新创建的对象中。
let objCopy = NSEntityDescription.insertNewObject(forEntityName:<#entityName#>, into:<#context#>)
objCopy.propertyA = objOrigin.propertyA
objCopy.propertyB = objOrigin.propertyB
...但是在上下文中处理托管对象的前提对我来说有点模糊。NSManagedObject仅反映实际数据片段某些临时状态。因此,如果您需要撤销对对象所做的某些更改,您可以随时执行此操作。您可以询问托管对象上下文,哪些对象已更改,您可以询问托管对象已更改的属性,您有undo()方法等。
因此,您应该考虑检查您的应用程序设计。可以肯定的是,您不需要对象的临时副本。
以防万一,如果你的副本不是临时性的,应该保存到持久化存储中--你必须手动和属性地复制这些对象(看看我答案的第一部分)。在这种应对的情况下,将有单独的挑战来决定如何处理引用-复制被引用的对象(深度复制),还是继续引用与原始对象相同的对象
https://stackoverflow.com/questions/46119393
复制相似问题