gpt4 book ai didi

ios - Realm 模型中的单一反向关系

转载 作者:IT王子 更新时间:2023-10-29 05:36:36 26 4
gpt4 key购买 nike

我正在开发一个简单的 iOS 应用程序来学习 Swift,并且我正在使用 Realm。据我所知,在 Realm 中,反向关系是通过 LinkingObjects 属性实现的,该属性是一个包含所有链接到该对象的对象的集合。

考虑 Realm 文档中的这个例子:

class Person: Object {
// ... other property declarations
let dogs = List<Dog>()
}

class Dog: Object {
dynamic var name = ""
dynamic var age = 0
let owners = LinkingObjects(fromType: Person.self, property: "dogs")
}

在我的模型中,我知道每个 Dog 实例将只有 一个 所有者,因为每只狗在创建时都只添加到一个列表

现在我想在 Dog 类中有一个 owner: Person 属性,它引用它的唯一所有者以使代码更直观和更简单(而不是每次都必须编写 dog.owners.first)同时保持延迟加载行为(它们是延迟加载的,对吧?)。我不知道查询“链接对象”的开销有多大,但由于周围会有很多“狗”,我认为最好不要在对象初始化时访问它们。

目前这些是我能想到的解决方案:

1:

class Dog: Object {
let owner: Person = LinkingObjects(fromType: Person.self, property: "dogs").first!
}

2a:

class Dog: Object {
private let owners = LinkingObjects(fromType: Person.self, property: "dogs")
lazy var owner: Person = {return self.owners.first!}()
}

2b:

class Dog: Object {
lazy var owner: Person = {
return LinkingObjects(fromType: Person.self, property: "dogs").first!
}()
}

3:

class Dog: Object {

private let owners = LinkingObjects(fromType: Person.self, property: "dogs")
var owner: Person {
return self.owners.first!
}

}

我不认为“解决方案 1”是延迟加载的,并且与“解决方案 2”一样​​,所有者 不会是“自动更新”,但这应该不是问题,因为在我的例子中,Dog 永远不会改变所有者。

如果要在 Swift 中建立单一反向关系,您会推荐什么?

最佳答案

唯一的方法是312a, 2b 都不起作用。

因为目前LinkingObjects只能用来初始化一个LinkingObjects类型的属性。 Realm 在初始化定义数据模式时读取类定义和所有属性。在 1 的代码中,owner 属性仅被视为 Person 属性。

2a2b 也不起作用。因为 Realm 不支持 lazy 属性。此外,2b 以与 1 相同的错误方式使用 LinkingObjects

因此,只有 3 按预期工作。

另见... https://github.com/realm/realm-cocoa/issues/3525#issuecomment-216920757

关于ios - Realm 模型中的单一反向关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37755132/

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