Swift diff realm.io без предварительной загрузки
Мне было интересно, есть ли возможность в realm.io (swift) выбрать все элементы из одной "таблицы", которых нет в другой.
Допустим, у вас есть 2 класса:
class A: Object {
dynamic var id: Int = 0
dynamic var text: String = ""
}
class B: Object {
dynamic var id: Int = 0
dynamic var value: Bool = false
}
Можно ли получить результат предметов от А, чей идентификатор отсутствует в Б?
1 ответ
Решение
На самом деле есть очень простой способ сделать это с помощью NSPredicate
на API фильтра Realm.
func fetch() throws -> [A] {
do {
// Create Realm
let realm = try Realm()
// Get B objects from Realm and put their IDs to [Int] array
let IdB: [Int] = realm.objects(B).map { $0.id }
// Create predicate
// Filter all items where property id is not present in array IdB
let predicateFilter = NSPredicate(format: "NOT (id IN %@)", IdB)
// Get all A objects from array using predicateFilter
let objectsA = realm.objects(A).filter(predicateFilter)
// Return the [A] array
return objectsA.map { $0 }
} catch {
// Throw an error if any
throw error
}
}
Также обратите внимание, что все объекты, извлеченные с использованием Realm, загружаются лениво, что означает, что этот метод также очень быстр. Из документации:
Все запросы (включая запросы и доступ к свойствам) ленивы в области. Данные читаются только при обращении к свойствам.