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, загружаются лениво, что означает, что этот метод также очень быстр. Из документации:

Все запросы (включая запросы и доступ к свойствам) ленивы в области. Данные читаются только при обращении к свойствам.

Другие вопросы по тегам