首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将NSManagedObject复制到Swift中的临时NSManagedObject中

将NSManagedObject复制到Swift中的临时NSManagedObject中
EN

Stack Overflow用户
提问于 2017-09-08 23:00:26
回答 2查看 594关注 0票数 0

我已经将一个NSManagedObject对象复制到一个临时NSManagedObject对象中。这样,如果用户输入没有变化,我就可以使用临时NSManagedObject对象。否则,我可以使用实际的NSManagedObject对象。

问题是,如果我更改实际NSManagedObject对象中的任何值,它会自动反映在一个临时NSManagedObject对象中。当我在网上搜索时,他们说NSManagedObject不符合NSCopying协议。此外,复制的对象将引用实际的NSManagedObject对象。

有没有办法克服这个问题?

EN

回答 2

Stack Overflow用户

发布于 2017-09-08 23:14:32

我认为知道为什么你“需要”一个临时的NSManagedObject会很有帮助。

NSManagedObject这样的类是引用类型。这意味着您的原始对象和临时对象都引用了内存中的相同地址,对其中一个对象的更改将反映在另一个对象中。

但是,结构是值类型。也许你可以创建一个结构,你可以用你的托管对象初始化它,并用它来存储你需要暂时保存的任何数据。

此外,具体到NSManagedObject,其想法是它们是临时的。当您更改托管对象的属性时,它不会持久化,直到您使用托管对象上下文将其写入持久性存储区。

票数 1
EN

Stack Overflow用户

发布于 2017-09-11 21:54:07

好吧,严格地说,是的,有。只需在托管对象上下文中创建实体类型新对象,并将所有属性逐个复制到新创建的对象中。

代码语言:javascript
复制
let objCopy = NSEntityDescription.insertNewObject(forEntityName:<#entityName#>, into:<#context#>)

objCopy.propertyA = objOrigin.propertyA
objCopy.propertyB = objOrigin.propertyB
...

但是在上下文中处理托管对象的前提对我来说有点模糊。NSManagedObject仅反映实际数据片段某些临时状态。因此,如果您需要撤销对对象所做的某些更改,您可以随时执行此操作。您可以询问托管对象上下文,哪些对象已更改,您可以询问托管对象已更改的属性,您有undo()方法等。

因此,您应该考虑检查您的应用程序设计。可以肯定的是,您不需要对象的临时副本。

以防万一,如果你的副本不是临时性的,应该保存到持久化存储中--你必须手动和属性地复制这些对象(看看我答案的第一部分)。在这种应对的情况下,将有单独的挑战来决定如何处理引用-复制被引用的对象(深度复制),还是继续引用与原始对象相同的对象

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46119393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档