DebouncedClosure 是现代 Swift 中防抖的微小而灵活的实现。它允许使用极简而简洁的语法来实现对任何任意闭包调用的防抖。
debounced(_ block:, _ interval:)
中,您将收到防抖的实现Task
和 Timer
的基本配置都不适用,则底层实现可以从客户端更改以下代码创建一个防抖的 logger 闭包,该闭包仅在 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()
TimeInterval
debounced(Logger.log, 1)
Duration
debounced(Logger.log, .seconds(1))
debounced(Logger.log, .timer(.seconds(1))) or debounced(Logger.log, .task(.seconds(1)))
debounced(Logger.log) { block in CustomScheduler.start(with: block) }
SwiftPM
.package(url: "https://github.com/aleksproger/debounced-closure.git", .upToNextMajor(from: "1.2.0"))