Поиск данных из Realm заблокировал основной поток

#ios #swift #realm

#iOS #swift #realm

Вопрос:

У меня есть старый проект, в котором есть алгоритм поиска локальных записей, основанный на базе данных Realm.

Основной поток будет заблокирован, когда начнется поиск в базе данных, содержащей тысячи записей.

Он не может быть переключен на другие потоки, поскольку существующая база данных Realm создана и запущена в основном потоке.

Кто-нибудь знает, как решить эту проблему с замятием?

Заранее спасибо.

 # The search algorithm is actually only applied a filter on the objects array.

# data is all items in database

data = realm.objects(CustomObject.self).filter(filterPredicate(parentID: id, keyword: keyword, colorIndex: colorIndexes, isActionOnly: True)).sorted(by: descSorting)


private func filterPredicate(parentID: Int?, keyword: String?, colorIndex: [Int]?, isActionOnly: Bool = false) -> InspirationFilterClosure {
    return { item in
        if item.isDeleted { return false }
        if let id = parentID, item.parentID != id { return false }
        else if item.parentID < 0 { return false }
        if isActionOnly, !item.isAction  { return false }
        if let indexes = colorIndex, !indexes.contains(-1), !indexes.contains(item.colorIndex) { return false }
        if let keyword = keyword, !keyword.isEmpty {
            return item.content.range(of: keyword, options: .caseInsensitive) != nil
        }
        return true
    }
}
  

Комментарии:

1. можете ли вы показать нам код алгоритма поиска? перед фильтрацией.

2. попробуйте запустить эту функцию асинхронно ..DispatchQueue.main.async { вызовите функцию здесь }

3. @MuhammadWaqasBhati он просто загружается data = realm.objects(CustomObject.self)

4. @ZeeshanAhmed Но проблема в том, что для завершения поиска требуется время, например, 2 секунды. В любом случае, это заблокирует основной поток.

Ответ №1:

У вас есть 2 варианта, чтобы избежать заклинивания основного потока

  • Вы должны использовать эту концепцию ThreadSafeReference, которая упоминается в документации.

  • Вы можете использовать концепцию уведомлений Realm для просмотра выбранных вами объектов в фоновом потоке.

Предложения: Пожалуйста, ознакомьтесь с приведенными выше концепциями и попробуйте реализовать их самостоятельно. если вы все еще сталкиваетесь с какой-либо проблемой, сообщите нам об этом.