了解 LinkingObjects in Realm Xcode 12,以及何时使用它

Understanding LinkingObjects in Realm Xcode 12, Also when to use it

在 Realm 中,我在理解(我是 Realm T,T 中的新手)LinkingObjects 的实现时遇到了问题,假设一个 Person 可能有不止一只 Dog(Dog 列表),所以我会编写如下代码:

Person : Object {
   dynamic var name:String = ""
   let dogs = List<Dog>() 
}

Dog : Object {
   dynamic var name: String = ""
   let walkers = LinkingObjects<fromType: Person.self, property:"dogs"> 
}

让我们说

Person A
dogs = [Alex,Cindy]

Person B
dogs = [Doggo,Kiba]

如果我使用 Realm.delete 删除 Alex,那么它会变成 Person A dogs = [Cindy] 这很简单。

但是当我从 class 中删除 LinkingObjects 时,如下所示:

 Person : Object {
   dynamic var name:String = ""
   let dogs = List<Dog>() 
}

Dog : Object {
   dynamic var name: String = ""
}

应用程序仍然可以 运行 正常,没有任何差异,我仍然可以添加 Person 3 并附加 Dog 列表。此外,在删除 (Realm.delete) 时,与将 LinkingObject 添加到 Dog class 时没有区别。这里有什么区别?我什么时候可以使用 LinkinObject?谁能解释一下?或者写一些更容易理解的代码?

已经阅读了之前的所有答案,但我仍然需要另一个解释。非常感谢!!

您几乎可以将 LinkingObjects 视为一个计算 属性 - 当子对象添加到父对象列表时,它会自动创建一个与父对象相反的 link。

所以当一条狗被添加到一个人的狗列表中时,一个人的参考被添加到狗的步行者列表中。请记住,这是一个多对多的关系,所以从技术上讲,如果 A 添加 Doggo,B 添加 Doggo,则 Doggo 的反向关系 'walkers' 将包含 A 和 B

the app still can run normally without any diff

是的,不影响应用程序的运行。然而,不同之处在于,通过删除步行者 LinkingObjects,无法查询 Dogs 的 Person 并获得 Dog 结果(即您无法将关系图遍历回 person )

换句话说,我们可以向 Person 查询各种狗东西

let results = realm.objects(Person.self).filter("ANY dogs.color == 'brown'")

其中 returns 结果对象包含 Persons that have a brown dog。但是,我们不知道他们养的哪只狗是棕色的;可以是一个,也可以是三个。

但是,假设您想要获得一个包含特定棕色狗的结果对象,并且想要每只狗的所有者姓名 - 如果没有反向关系 (LinkingObjects),您将无法真正做到这一点

let dogResult = realm.object(Dog.self).filter("color == 'brown'")
for dog in dogResult {
   let person = dog.walkers.first!.name //assume there is only one owner
   print(person.name)
}

dogResults 将只包含棕色的狗,你知道具体是哪些狗。

所以这是一个很大的不同;在没有 LinkingObjects 的情况下,我们依赖于返回 Person 对象,然后迭代或处理每个对象以获得我们想要的数据。使用 LinkingObjects 我们可以专门获取我们想要使用的对象。

当你想在结果中添加一个观察者来观察变化时——比如在棕色狗身上——接收变化通知时,它非常方便。