#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 для просмотра выбранных вами объектов в фоновом потоке.
Предложения: Пожалуйста, ознакомьтесь с приведенными выше концепциями и попробуйте реализовать их самостоятельно. если вы все еще сталкиваетесь с какой-либо проблемой, сообщите нам об этом.