2016-06-10 53 views
8

我正在開發一個簡單的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實例只會有一個所有者,因爲每一個狗,當創建僅被添加到一個PersonList

現在我想有在Dogowner: 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! 
    } 

} 

我不認爲「解」是懶加載,並在「解決方案」,該owner不會被「自動更新」,但是這不應該是一個問題,因爲在我的情況下,Dog將永遠不會改變所有者。

你會推薦在Swift中有一個單個反比關係嗎?

回答

8

唯一的辦法是。 和2a,2b都不起作用。

因爲目前LinkingObjects只能用於初始化LinkingObjects類型的屬性。 Realm在初始化定義數據模式時讀取類定義和所有屬性。在代碼,owner屬性被視爲只是Person屬性。

2a and 2b也不起作用。因爲Realm不支持lazy屬性。另外2b使用LinkingObjects以與相同的錯誤方式使用。

因此,只有按預期工作。

也見... https://github.com/realm/realm-cocoa/issues/3525#issuecomment-216920757

0

也許你可以設置在「one'端的實際關係?

  • 指定的連接「one'端
  • 請在在吸氣查詢」 many'端:

所以應該這樣寫:

class Dog: Object { 

    dynamic var name:String = "" 
    dynamic var owner:Owner? = nil 

} 

class Ownder: Object { 

    dynamic var name:String = "" 

    var dogs:Results<Dog>? { 
     return realm?.objects(Dog).filter(NSPredicate(format: "owner == %@", self)) 
    } 

}