★★ 点亮 Star 以关注项目! ★★
由 Daniele Margutti 创建 - danielemargutti.com
Repeat 是 NSTimer
的一个小巧轻量级的替代品,具有现代 Swift 语法,没有强引用,多个观察者可重用实例。 Repeat 基于 GCD - Grand Central Dispatch。 它还支持防抖和节流功能。
如果您想了解更多信息,请查看我在 Medium 上的文章:"NSTimer 的秘密世界"。
Repeat 提供的主要功能有
every()
或 once
即可创建新的 Timer,即使在后台线程中也是如此。infinite
:无限次触发,以固定的时间间隔触发, finite
:有限次触发,以固定的时间间隔触发, 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
:定义计时器的类型 (infinite
,finite
,once
).remainingIterations
:对于 .finite
模式,它包含完成之前的剩余迭代次数。默认情况下,新的计时器具有 init 函数指定的单个观察者。 但是,您可以使用 observe()
函数创建额外的观察者。 此调用的结果是令牌标识符,您可以使用该标识符在第二次删除观察者。 在回调中收到的 Timer 实例是弱引用。
let token = timer.observe { _ in
// a new observer is called
}
timer.start()
您可以使用令牌删除观察者
timer.remove(token)
每个计时器都可以处于以下状态之一,您可以通过 .state
属性进行观察
.paused
:计时器处于空闲状态(尚未启动)或已暂停.running
:计时器当前处于活动状态并正在运行.executing
:正在执行已注册的观察者.finished
:计时器生命周期已完成(对于 finite/once 状态的计时器有效)您可以通过为 .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 平台
Repeat 的最新版本是 0.5.4,发布于 2018/04/28。 完整的变更日志可在 CHANGELOG.md 文件中找到。
CocoaPods 是 Objective-C 的依赖管理器,它可以自动化和简化在您的项目中使用像 Repeat 这样的第三方库的过程。 您可以使用以下命令安装它
$ sudo gem install cocoapods
需要 CocoaPods 1.0.1+ 才能构建 Repeat。
要使用 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 是一个去中心化的依赖管理器,它可以构建您的依赖项并为您提供二进制框架。
您可以使用 Homebrew 使用以下命令安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 将 Repeat 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它
github "malcommac/Repeat"
运行 carthage
来构建框架,并将构建的 Repeat.framework
拖到您的 Xcode 项目中。