【问题标题】: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() 方法等。

    因此,您应该考虑审查您的应用程序设计。很确定,您不需要拥有对象的临时副本。

    如果您的副本不是临时性的并且应该保存到持久存储中 - 您必须手动复制这些对象并按属性进行复制(请看我回答的第一部分)。在这种应对的情况下,将有单独的挑战来决定如何处理引用 - 复制引用的对象(深拷贝),或者只是继续引用与原始对象相同的对象

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 2011-03-11
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多