gpt4 book ai didi

ios - 如何制作一个保持不变的核心数据对象的副本

转载 作者:搜寻专家 更新时间:2023-10-31 22:29:54 24 4
gpt4 key购买 nike

核心数据,自动更新导致问题的更改对象,并使事情变得比需要的更困惑。

假设我有这段代码:

let fetchRequest = Track.fetchRequest()

//update it
do {
let tracksFound = try self.managedObjectContext.fetch(fetchRequest) as! [Track]
print("retrieved")

let trackToUpdate = tracksFound[0]

trackToUpdate.locality = "please dont have updated"

do {
try self.managedObjectContext.save()
print("saved")
}
catch {
fatalCoreDataError(error)
}

for t in tracksFound {
print(t.locality)
}
}
catch {
fatalCoreDataError(error)
}

您可以看到它获取了一个[Track] 对象数组,然后它用please dont have updated 正确地更新了第一个元素locality。然后它保存这个对象。最后,它读取开始时定义的 tracksFound 数组。我曾期望 tracksFound 保持不变,对象 tracksFound[0].locality 已更改为 请不要更新

如何阻止 Core Data 更新我的对象?我基本上想制作一份 tracksFound 的副本,该副本将保持不变,以便我以后可以将其用于决策。

谢谢

最佳答案

正如 Michael 的评论中提到的,trackToUpdate 是对 NSManagedObject 实例的引用。指向同一个对象的不同引用,...指向同一个对象。所以没有办法改变一个对象而让另一个对象保持不变,因为没有其他对象。 Swift 故意混淆引用,无论谁有那个非常非常聪明的想法。

如您所说,您必须创建一个副本。 NSManagedObject 没有实现 NSCopying 协议(protocol)。这样做有充分的理由:如果实例引用其他实例(关系),您必须决定是否也复制它们。这样做会导致复制整个图表的危险。不这样做会使您回到最初的问题,即您共享一个引用的实例。你必须做出决定。

将属性复制到一个简单的字典中可能会更好。请记住,创建一个新实例,这将成为对象图的一部分。具有“短时间”托管对象是一种代码味道(即使这个术语可能太难了)。

但是,您可以创建一个新实例。然后通过-entity获取对象的实体描述。实体描述有一个属性 -properties,它包含所有属性的列表。使用它,您可以迭代源属性并将其存储到新实例中。由于 Objective-C 的键值编码,可以在运行时执行此操作。

关于ios - 如何制作一个保持不变的核心数据对象的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40624381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com