Создание свойства LinkingObjects в RealmSwift с использованием многоуровневых свойств
Согласно документации Realm для v0.102.0, это то, как вы создаете обратную связь:
Человек
class Person: Object {
// ... other property declarations
let dogs = List<Dog>()
}
Собака (v1)
class Dog: Object {
// ... other property declarations
let owners = LinkingObjects(fromType: Person.self, property: "dogs")
}
Предположим, что у нас есть другой класс, называемый DogFood
и мы хотим создать обратную связь под названием buyers
который отслеживает, какие случаи Person
иметь Dog
который ест этот экземпляр DogFood
, Мы могли бы попробовать следующее:
Собака (v2)
class Dog: Object {
// ... other property declarations
let favoriteFoods = List<DogFood>
let owners = LinkingObjects(fromType: Person.self, property: "dogs")
}
Собачья еда
class DogFood: Object {
// ... other property declarations
let buyers = LinkingObjects(fromType: Person.self, property: "dogs.favoriteFoods")
}
Однако это приводит к следующей ошибке: Property 'dogs.favoriteFoods' declared as origin of linking objects property 'buyers' does not exist.
Есть ли другой способ добиться того же эффекта?
1 ответ
Это может быть достигнуто с помощью фильтра, с оговоркой, что DogFood
объект, который мы должны запросить о необходимости быть частью Realm
,
Код будет выглядеть следующим образом:
class DogFood: Object {
// ... other property declarations
var items: Results<Person> {
if let realm = self.realm {
return realm.objects(Person).filter(NSPredicate(format: "ANY dogs.favoriteFoods.id == %@", self.id))
} else {
return RealmSwift.List<Person>().filter("1 != 1")
}
}
}
Недвижимость realm
имеет тип Realm?
и входит в картину по наследству от Object
, Это указывает на то, что конкретный Object
экземпляр находится в и возвращает nil
если не назначен одному. Если это так, мы заставляем собственность items
вернуть пустой набор Results<Person>
,