如何在变量停止变化2秒后执行代码(SwiftUI TextField场景)
SwiftUI TextField 防抖搜索实现(延迟1-2秒执行搜索)
你可以通过以下两种常用方式实现输入防抖,避免每次输入字符都立即触发搜索:
方案一:使用 Combine 的 Debounce 操作符
Combine 是 SwiftUI 原生支持的响应式框架,用它实现防抖非常简洁:
import SwiftUI import Combine struct SearchView: View { @State private var searchBody = "" // 用于保存订阅,防止提前释放 private var searchCancellable: AnyCancellable? var body: some View { TextField("Search", text: $searchBody) .onChange(of: searchBody) { query in // 每次输入变化时,取消之前的延迟任务 searchCancellable?.cancel() // 延迟2秒执行搜索逻辑,若期间输入再次变化则重新计时 searchCancellable = Just(query) .debounce(for: .seconds(2), scheduler: DispatchQueue.main) .sink(receiveValue: { finalQuery in // 空输入时跳过搜索 guard !finalQuery.isEmpty else { return } print("执行搜索:\(finalQuery)") // 在这里编写你的搜索逻辑 }) } } }
方案二:使用 Timer 手动实现防抖
如果不想依赖 Combine,也可以用 Timer 手动控制延迟:
import SwiftUI struct SearchView: View { @State private var searchBody = "" // 用于保存定时器实例 private var searchTimer: Timer? var body: some View { TextField("Search", text: $searchBody) .onChange(of: searchBody) { query in // 每次输入变化时,重置定时器 searchTimer?.invalidate() // 2秒后触发搜索,若期间输入变化则重新计时 searchTimer = Timer.scheduledTimer(withTimeInterval: 2, repeats: false) { _ in guard !query.isEmpty else { return } print("执行搜索:\(query)") // 在这里编写你的搜索逻辑 } } .onDisappear { // 页面消失时清理定时器,避免内存泄漏 searchTimer?.invalidate() } } }
注意事项
- 可根据需求调整延迟时间(将代码中的
2改为1即可实现1秒延迟) - 加入空值判断,避免用户清空输入时触发无效搜索请求
- Combine 方案需要额外导入
Combine框架,Timer 方案无需依赖第三方
内容的提问来源于stack exchange,提问作者Jack Bodine
相关产品推荐
相关产品推荐

