根据这个答案,从现有托管对象获取非托管对象所需要做的就是执行以下操作:
let unmanagedObject = Object(value: existingObject)
但是,当我执行此操作时,作为托管领域对象本身的
existingObject
的任何字段在复制后仍保留为托管领域对象。我必须做什么才能使副本的所有子对象也变得不受管理?
问题中的代码制作非托管副本是正确的:
let unmanagedObject = Object(value: existingObject)
但请记住,它只是该对象及其属性的副本 - 关系引用的对象不会受到影响,也不会被复制(引用被复制并且可以更改,但不能更改该引用处的对象)
例如,给定一个人和狗
class Person: Object {
@Persisted var name = ""
@Persisted var myDog: Dog!
}
class Dog: Object {
@Persisted var name = ""
@Persisted var myPerson: Person!
}
如果实例化一个人和狗
let p = Person()
p.name = "Jay"
let d = Dog()
d.name = "Scraps"
p.myDog = d
d.myPerson = p
然后它们被写入领域
try! realm.write {
realm.add(p)
realm.add(d)
}
稍后我们找到此人并制作一份非托管副本
let jay = realm.objects(Person.self).where { $0.name == "Jay" }.first!
let jayCopy = Person(value: jay)
jayCopy 将具有与原始对象相同的所有属性,但对狗的引用只是一个引用,而不是实际的 Dog 对象。
要更改 Dog 对象,您还需要制作狗的非托管副本
let dogCopy = Dog(value: jayCopy.dog)