2016-06-10 1 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.

Теперь я хотел бы иметь owner: Person свойства в классе Dog, что ссылки на его единственный владелец, чтобы сделать код более понятными и простым (вместо того, чтобы писать 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 и 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)) 
    } 

}