gpt4 book ai didi

swift - 异步搜索栏

转载 作者:行者123 更新时间:2023-12-03 08:00:26 26 4
gpt4 key购买 nike

我需要使用搜索栏过滤模型数据。我添加了 .searchable() 属性,当搜索文本更改时,我会使用模糊匹配来过滤对象。这需要太多时间,并且应用程序在写入搜索框时会出现滞后。所以我想异步进行搜索,这样应用程序就不会卡住。

我尝试使用 onChange(of:) 属性来执行此操作,然后创建一个运行异步函数的 Task ,因为 onChange() 属性本身不允许异步函数。但该应用程序仍然滞后。

以下是我尝试执行此操作的代码示例:

import SwiftUI
import Fuse

struct SearchView: View {
@EnvironmentObject var modelData: ModelData

@State var searchText = ""
@State var searchResults: [Item] = []
@State var searchTask: Task<(), Never>? = nil

let fuseSearch = Fuse()

var body: some View {
// Show search results
}
.searchable(text: $searchText)
.onChange(of: searchText) { newQuery in
// Cancel if still searching
searchTask?.cancel()

searchTask = Task {
searchResults = await fuzzyMatch(items: modelData.items, searchText: newQuery)
}
}


func fuzzyMatch(items: [Item], searchText: String) async -> [Item] {
filteredItems = items.filter {
(fuseSearch.search(searchText, in: $0.name)?.score ?? 1) < 0.25
}

return filteredItems
}
}

我真的很感激一些帮助。

最佳答案

我认为主要问题是像前面提到的 lorem ipsum 那样的去抖动。我刚刚测试了我的代码,您需要在我打印的地方调用您的过滤方法。

这样您就不会过滤每个编辑文本字段。您将在几毫秒后进行过滤,您可以更改该过滤器。

您可以在此链接中找到更多详细信息 SwiftUI Combine Debounce TextField

    struct Example: View {

@State var searchText = ""
let searchTextPublisher = PassthroughSubject<String, Never>()

var body: some View {
NavigationView {
Text("Test")
}
.searchable(text: $searchText)
.onChange(of: searchText) { searchText in
searchTextPublisher.send(searchText)
}
.onReceive(
searchTextPublisher
.debounce(for: .milliseconds(500), scheduler: DispatchQueue.main)
) { debouncedSearchText in
print("call your filter method")
}
}
}

关于swift - 异步搜索栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74466453/

26 4 0