Фильтрация через большой массив вызывает замораживание - Swift - PullRequest
2 голосов
/ 13 марта 2020

Я пытаюсь отфильтровать большую базу данных объектов с массивами строк, в данном случае, kids.

class Thing: Object, Decodable {
  @objc dynamic var id: String?
  let kids = List<String>
}

Поскольку Realm не поддерживает запрос примитивных данных в массивах (согласно Царство, ты еще не можешь использовать предикат и фильтр, чтобы сделать это), я использую это, чтобы отфильтровать их:

let things = realm.objects(Thing.self)
for thing in things {
    if thing.kids.contains("Momo") {
        // Success
    }
}

Я также пробовал:

realm.objects(Thing.self).filter(NSPredicate("%@ IN kids", "Momo"))

Но это не работает. Я также пытался использовать SUBQUERY внутри предиката, но он также не работает для примитивных типов данных.

Поскольку у меня есть тысячи Thing объектов, это очень медленно и приводит к зависанию моего приложения. Есть ли способ ускорить это или заставить его не заморозить мое приложение, по крайней мере? Я не могу создать новый пользовательский класс для строк, потому что мне пришлось бы полностью изменить свой JSON, где все хранится.

1 Ответ

1 голос
/ 13 марта 2020

На основе комментариев вы можете попробовать выполнить задачу в фоновом потоке. Обновления пользовательского интерфейса должны использовать основной поток.

DispatchQueue.global(qos: .background).async

Переместите код, который замораживает ваш пользовательский интерфейс, в блок ниже, чтобы он выполнялся асинхронно.

DispatchQueue.main.async(execute: {
    // Place code that freezes UI or takes time to execute here. 
    let things = realm.objects(Thing.self)
    for thing in things {
        if thing.kids.contains("Momo") {
            // Success
        }
    }
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...