swiftui - 如何在 SwiftUI 中读取和过滤大型 Realm 数据集?
问题描述
我在领域数据库中存储了约 100.000 个字典条目,并希望显示它们。此外,我想通过搜索字段过滤它们。现在我遇到了一个问题:尽管我尝试对搜索进行去抖动,但搜索功能确实效率低下。
查看型号:
class DictionaryViewModel : ObservableObject {
let realm = DatabaseManager.sharedInstance
@Published var entries: Results<DictionaryEntry>?
@Published var filteredEntries: Results<DictionaryEntry>?
@Published var searchText: String = ""
@Published var isSearching: Bool = false
var subscription: Set<AnyCancellable> = []
init() {
$searchText
.debounce(for: .milliseconds(800), scheduler: RunLoop.main) // debounces the string publisher, such that it delays the process of sending request to remote server.
.removeDuplicates()
.map({ (string) -> String? in
if string.count < 1 {
self.filteredEntries = nil
return nil
}
return string
})
.compactMap{ $0 }
.sink { (_) in
} receiveValue: { [self] (searchField) in
filter(with: searchField)
}.store(in: &subscription)
self.fetch()
}
public func fetch(){
self.entries = DatabaseManager.sharedInstance.fetchData(type: DictionaryEntry.self).sorted(byKeyPath: "pinyin", ascending: true)
self.filteredEntries = entries
}
public func filter(with condition: String){
self.filteredEntries = self.entries?.filter("pinyin CONTAINS[cd] %@", searchText).sorted(byKeyPath: "pinyin", ascending: true)
}
在我的视图中,我只是filteredEtries
在 ScrollView 中显示
去抖动对于像“hello”这样的短文本输入效果很好,但是当我过滤“这是一个非常长的字符串”时,我的 UI 会冻结。我不确定我的去抖动功能是否有问题,或者我处理数据过滤的方式非常低效。
编辑:我注意到 UI 冻结,尤其是当结果为空时。
编辑 2: .fetchData() 函数就在这里:
func fetchData<T: Object>(type: T.Type) -> Results<T>{
let results: Results<T> = realm.objects(type)
return results
}
所有领域对象都有一个主键。结构如下所示:
@objc dynamic var id: String = NSUUID().uuidString
@objc dynamic var character: String = ""
@objc dynamic var pinyin: String = ""
@objc dynamic var translation: String = ""
override class func primaryKey() -> String {
return "id"
}
编辑 3:过滤后的结果以这种方式显示:
ScrollView{
LazyVGrid(columns: gridItems, spacing: 0){
if (dictionaryViewModel.filteredEntries != nil) {
ForEach(dictionaryViewModel.filteredEntries!){ entry in
Text("\(entry.translation)")
}
} else {
Text("No results found")
}
}
解决方案
推荐阅读
- stripe-payments - 如何在点对点市场上使用 Stripe 进行设置?
- php - PHP自定义div以彼此相邻放置
- regex - 如何将正则表达式结果附加到bash中的现有txt文件?
- python-3.x - Discord.py:我的程序似乎无法区分错误(MissingPerms、BotMissingPerms),因此使用了错误的处理程序
- nginx - 有条件地映射 nginx 配置中的值
- r - TidyR 解决方案在多列上计算 str_detect 的数量?
- python - 从 reactjs 客户端连接到安全 Web 套接字 python 服务器
- c++ - CMake 共享(或静态?)库无法链接
- javascript - 尝试在 WebdriverIO 中断言 getText 时出错
- jsp - 在 jsps 中使用 web 组件