如何获取 Realm 对象的非托管版本

问题描述 投票:0回答:1

根据这个答案,从现有托管对象获取非托管对象所需要做的就是执行以下操作:

let unmanagedObject = Object(value: existingObject)

但是,当我执行此操作时,作为托管领域对象本身的

existingObject
的任何字段在复制后仍保留为托管领域对象。我必须做什么才能使副本的所有子对象也变得不受管理?

ios realm
1个回答
0
投票

问题中的代码制作非托管副本是正确的:

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)
© www.soinside.com 2019 - 2024. All rights reserved.