Repeat - GCD 中的现代 NSTimer,防抖和节流

Version License Platform CocoaPods Compatible Carthage Compatible Twitter

★★ 点亮 Star 以关注项目! ★★
Daniele Margutti 创建 - danielemargutti.com

Repeat 是 NSTimer 的一个小巧轻量级的替代品,具有现代 Swift 语法,没有强引用,多个观察者可重用实例。 Repeat 基于 GCD - Grand Central Dispatch。 它还支持防抖和节流功能。

深入了解 Timer

如果您想了解更多信息,请查看我在 Medium 上的文章:"NSTimer 的秘密世界"

功能亮点

Repeat 提供的主要功能有

此外,Repeat 还提供对以下内容的支持

您可能喜欢的其他库

我也在开发几个您可能喜欢的其他项目。 请查看下面的内容

描述
SwiftDate 在 Swift 中管理日期/时区的最佳方式
Hydra 编写更好的异步代码:async/await & promises
Flow 一种新的表格管理声明式方法。 忘记数据源和委托。
SwiftRichString Swift 中优雅且轻松的 NSAttributedString
SwiftLocation 高效的位置管理器
SwiftMsgPack 快速/高效的 msgPack 编码器/解码器

文档

Timer

注意:与其他任何对象一样,Repeater 类也受标准内存管理规则的约束。 因此,一旦创建了计时器实例,您需要将其保留在某个地方,以避免在启动命令后立即过早释放。

创建单次触发计时器

以下代码创建一个计时器,该计时器在 5 秒后触发一次。

self.timer = Repeater.once(after: .seconds(5)) { timer in
  // do something	
}

创建循环有限计时器

以下代码创建一个循环计时器:它将每 10 分钟触发一次,触发 5 次后停止。

self.timer = Repeater.every(.minutes(10), count: 5) { timer  in
  // do something		
}

创建循环无限计时器

以下代码创建一个循环计时器,该计时器每小时触发一次,直到手动停止为止。

self.timer = Repeater.every(.hours(1)) { timer in
  // do something
}

管理计时器

您可以通过调用 start() 函数来创建计时器的新实例,并在需要时启动它。

self.timer = Repeater(interval: .seconds(5), mode: .infinite) { _ in
  // do something		
}
timer.start()

其他函数包括

属性

添加/删除观察者

默认情况下,新的计时器具有 init 函数指定的单个观察者。 但是,您可以使用 observe() 函数创建额外的观察者。 此调用的结果是令牌标识符,您可以使用该标识符在第二次删除观察者。 在回调中收到的 Timer 实例是弱引用。

let token = timer.observe { _ in
  // a new observer is called		
}
timer.start()

您可以使用令牌删除观察者

timer.remove(token)

观察状态变化

每个计时器都可以处于以下状态之一,您可以通过 .state 属性进行观察

您可以通过为 .onStateChanged 属性分配函数回调来监听状态变化。

timer.onStateChanged = { (timer,newState) in
	// your own code
}

防抖 (Debouncer)

自 0.5 起,Repeater 引入了 Debouncer 类。 防抖会延迟函数调用,并且每次被调用时,它都会延迟先前的调用,直到延迟时间结束。

防抖函数是一个非常有用的工具,可以帮助限制请求。 它与节流不同,因为节流允许每个时间段只有一个请求,而防抖不会立即触发,而是等待指定的时间段后再触发请求。 如果在时间段结束之前发出另一个请求,则我们会重新启动计数。 这对于调用经常被调用且只需要在所有更改都完成后运行一次的函数非常有用。

let debouncer = Debouncer(.seconds(10))
debouncer.callback = {
	// your code here
}

// Call debouncer to start the callback after the delayed time.
// Multiple calls will ignore the older calls and overwrite the firing time.
debouncer.call()

(请务必查看单元测试以获取更多代码示例。)

节流 (Throttler)

自 0.5 起,Repeater 引入了 Throttler 类。

节流用节流逻辑包装代码块,保证操作在指定的时间间隔内永远不会被调用超过一次。 只有在延迟过去后,才会执行最后调度的代码块。

let throttler = Throttler(time: .milliseconds(500), {
  // your code here
})

// Call throttler. Defined block will never be called more than once each specified interval.
throttler.call()

要求

Repeat 与 Swift 4.x 兼容。 支持所有 Apple 平台

最新版本

Repeat 的最新版本是 0.5.4,发布于 2018/04/28。 完整的变更日志可在 CHANGELOG.md 文件中找到。

安装

通过 CocoaPods 安装

CocoaPods 是 Objective-C 的依赖管理器,它可以自动化和简化在您的项目中使用像 Repeat 这样的第三方库的过程。 您可以使用以下命令安装它

$ sudo gem install cocoapods

需要 CocoaPods 1.0.1+ 才能构建 Repeat。

通过 Podfile 安装

要使用 CocoaPods 将 Repeat 集成到您的 Xcode 项目中,请在您的 Podfile 中指定它

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target 'TargetName' do
use_frameworks!
pod 'Repeat'
end

然后,运行以下命令

$ pod install

Carthage

Carthage 是一个去中心化的依赖管理器,它可以构建您的依赖项并为您提供二进制框架。

您可以使用 Homebrew 使用以下命令安装 Carthage

$ brew update
$ brew install carthage

要使用 Carthage 将 Repeat 集成到您的 Xcode 项目中,请在您的 Cartfile 中指定它

github "malcommac/Repeat"

运行 carthage 来构建框架,并将构建的 Repeat.framework 拖到您的 Xcode 项目中。