Realm模型中的单一反比关系

Lor*_*ssi 10 lazy-loading realm ios swift

我正在开发一个简单的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")
}
Run Code Online (Sandbox Code Playgroud)

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

现在,我想有一个owner: Person属性的Dog类,它唯一的主人引用使代码更直观,更简单的(而不必写出dog.owners.first每一次),同时保持延迟加载行为(它们被延迟加载的,对不对? ).我不知道查询"链接对象"有多贵,但由于周围会有很多"狗",我认为最好不要在对象初始化时访问它们.

现在这些是我能想到的解决方案:

1:

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

2A:

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

2B:

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

3:

class Dog: Object {

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

}
Run Code Online (Sandbox Code Playgroud)

我不认为"解决方案1 "是延迟加载的,并且在"解决方案2 "中,owner不会"自动更新",但这不应该是一个问题,因为在我的情况下,一个Dog不会改变所有者.

你有什么建议有一个单一的斯威夫特反比关系?

kis*_*umi 10

唯一的方法是3.无论是1也不是2A,2B不工作.

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

2a2b也不起作用.因为Realm不支持lazy属性.2bLinkingObjects以与1相同的错误方式使用.

因此,只有3个按预期工作.

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