Repeat - GCD、去抖动器和节流器的现代 NSTimer
★★ 给我星标以跟踪项目! ★★
由 Daniele Margutti 创建 - danielemargutti.com
Repeat 是一个轻量级的选择,类似于 NSTimer
,拥有现代的 Swift 语法,不显示强烈的引用,具有多个观察者可重复使用的实例。Repeat 基于 GCD - 大中央调度。它还支持去抖动器和节流器功能。
深入了解定时器
如果想要了解更多,请查看我在 Medium 上的文章: "NSTimer 的秘密世界"。
功能亮点
Repeat 提供的主要功能有:
- 简单、简洁的 API 方法来创建和管理我们的定时器。只需调用
every()
或once
即可创建一个新定时器,即使在后台线程中。 - 避免强大的引用 到目标,并避免 NSObject 继承。
- 支持 多个观察者 接收定时器的事件。
- 能够 暂停、开始、恢复和重置 我们的大定时器,而无需创建一个新实例。
- 能够设置 不同的重复模式(
无限
:无限序列的触发,以固定的时间间隔,有限
:有限序列的触发,以固定的时间间隔,once
:在指定的间隔后触发一次事件)。
此外,Repeat 还提供
- 去抖动器:去抖动器会延迟一个函数调用,每次它被调用时,它都会将前面的调用延迟到延迟时间结束为止。
- 节流器:节流包装一个代码块,确保在一个指定的时间间隔内,一个动作不会被连续调用超过一次。
你可能喜欢的其他库
我还在做几个你可能会喜欢的其他项目。请往下看。
库 | 描述 |
---|---|
SwiftDate | Swift中管理日期/时区最好的方式 |
Hydra | 编写更好的异步代码:async/await & promises |
Flow | 表格管理的新声明式方法。忘了数据源和代理。 |
SwiftRichString | Swift中优雅、无痛的NSAttributedString |
SwiftLocation | 高效的位置管理器 |
SwiftMsgPack | 快速/高效的msgPack编码/解码器 |
文档
定时器
注意:和其他对象一样,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()
其他功能包括
start()
:启动一个暂停或新创建的定时器pause()
:暂停一个正在运行的定时器reset(_ interval: Interval, restart: Bool)
:重置一个正在运行的定时器,更改间隔并在设置的情况下重新启动。fire()
:从外部源手动触发定时器的イベント
属性
.id
:定时器的唯一标识符.mode
:定义定时器的类型(《无限 《有限 《一次).remainingIterations
:在《有限》模式下,它包含在完成之前剩余的迭代次数。
添加/删除观察者
默认情况下,新定时器通过初始化函数指定了一个观察者。但是,您可以使用observe()
函数创建其他观察者。此调用的结果是您可以使用其删除观察者的令牌标识符。回调中接收到的定时器实例是弱引用。
let token = timer.observe { _ in
// a new observer is called
}
timer.start()
您可以使用令牌删除观察者
timer.remove(token)
观察状态改变
每个定时器可以处于以下状态之一,您可以通过.state
属性进行观察
.paused
:定时器处于空闲状态(尚未启动)或已暂停.running
:定时器当前处于活动状态并且在运行.executing
:注册的观察者正在执行.finished
:定时器生命周期已完成(对于《有限》或《一次》状态的定时器有效)
您可以为.onStateChanged
属性分配一个函数回调来监听状态变化。
timer.onStateChanged = { (timer,newState) in
// your own code
}
防抖器
自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()
(请确保查看单元测试,以获取更多代码示例。)
节流器
自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平台
- iOS 8.0+
- macOS 10.10+
- watchOS 2.0+
- tvOS 9.0+
最新版本
Repeat的最新版本为0.5.4,发布于2018年4月28日。完整的变更日志可在CHANGELOG.md
文件中找到。
安装
通过 CocoaPods 安装
CocoaPods 是 Objective-C 的依赖管理工具,能够自动化并简化使用如 Repeat 等第三方库的过程。您可以使用以下命令来安装它:
$ sudo gem install cocoapods
构建 Repeat 需要至少 CocoaPods 1.0.1+。
通过 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 项目。