一种简单而灵活的方式来优化 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
<