一种简单而灵活的方式来优化 Swift 中的闭包调用
DebouncedClosure
简单灵活的方式来消抖闭包调用
DebouncedClosure 是现代 Swift 中消抖的精简且灵活的实现。 它允许通过简约和简洁的语法实现对任意闭包调用的消抖。
亮点
- 简单而灵活的 API 只需将你的闭包包装到
debounced(_ block:, _ interval:)
中,你将收到消抖的实现 - 测试实现包含测试
- 轻量级 该软件包很小,并且不会给 SPM 解析过程带来任何开销
- 灵活 如果既不适用
Task
也不适用Timer
的基本配置,客户端可以更改底层实现
用法
为观察 TextField 更改注入消抖的记录器
以下代码创建了一个消抖的记录器闭包,它将在 TextField 空闲 1 秒后才触发事件
struct ExampleViewOne: View {
@State
private var text = ""
let log: (String) -> Void
var body: some View {
TextField("Text", text: $text)
.onChange(of: text, perform: log)
}
}
struct Logger {
static func log(_ message: String) { print(message) }
}
ExampleViewOne(log: debounced(Logger.log, 1)) ✅
将对消抖函数的调用注入客户端
下面的代码将对 debounced(_ block:, _ interval:)
的调用直接注入客户端代码,该客户端代码会被调用多次。
这是不正确的,因为 debounced(_ block:, _ interval:)
充当消抖闭包的工厂,因此只会创建多个消抖闭包
struct ExampleViewThree: View {
@State
private var text = ""
var body: some View {
TextField("Text", text: $text)
.onChange(of: text, perform: debounced(Logger.log, .seconds(1))) ❌
}
}
struct Logger {
static func log(_ message: String) { print(message) }
}
ExampleViewThree()
Sources/Examples 中示例的说明
Debounce.mov
不同的函数签名
- 将间隔用作
TimeInterval
debounced(Logger.log, 1)
- 将间隔用作
Duration