DebouncedClosure

对闭包调用进行防抖的简单而灵活的方法

DebouncedClosure 是现代 Swift 中防抖的微小而灵活的实现。它允许使用极简而简洁的语法来实现对任何任意闭包调用的防抖。

亮点

用法

注入一个防抖的 logger 以观察 TextField 的更改

以下代码创建一个防抖的 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()

Sources/Examples 中的示例说明

Debounce.mov

不同的函数签名

debounced(Logger.log, 1)
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"))