То, как вы подсчитывали, требует, чтобы все Dog
объекты были загружены в память, что действительно неэффективно. Вот почему вы видели такие плохие показатели. Вы хотите воспользоваться функциями отложенной загрузки Realm. Вы можете прочитать об этом.
Я бы обновил ваш Dog
объект, избавившись от управляемого свойства Person
и заменив его LinkingObjects. Если вы сохраните Dog
в Person.dogs
Списке, то область создаст для вас обратную ссылку на Person
. Скорее всего, вы захотите сделать то же самое с Cat
. Таким образом, вы можете настроить несколько действительно мощных вложенных запросов.
Для удобства вы можете добавить вычисляемое свойство Person
для индексации в LinkingObjects
. Просто знайте, что вы не сможете использовать это свойство ни в одном из ваших запросов.
class Dog: Object {
@objc dynamic var name = ""
let persons = LinkingObjects(fromType: Person.self, property: "dogs")
var person: Person? { persons.first }
}
Один из способов подсчета количества - это запрос всех объектов Person
и суммирование числа * 1018. * для каждого Person
.
let count = realm.objects(Person.self).reduce(0) { result, person in
return result + person.dogs.count
}
Другим вариантом является запрос Dog
объектов, имеющих соответствующий Person
. Если Dog
нет в списке Person.dogs
, запрос не будет отображаться.
let realm = try! Realm()
let count = realm.objects(Dog.self).filter("persons.@count > 0").count
Любой из этих вариантов будет намного, намного эффективнее, чем у вас.
Надеюсь, это поможет.