速率限制
一个仅在某些时间间隔执行代码的简单实用工具。
仅在对于给定的 name
上次调用时间超过 limit
或它从未被调用时,才执行传递给 name
的代码块。
这在 viewDidAppear:
中刷新内容特别有用,但可以防止它频繁发生。
速率限制是完全线程安全的。在 MIT 协议 下发布。
用法
我们将从 TimedLimiter
开始
// Initialize with a limit of 5, so you can only use this once every 5 seconds.
let refreshTimeline = TimedLimiter(limit: 5)
// Call the work you want to limit by passing a block to the execute method.
refreshTimeline.execute {
// Do some work that runs a maximum of once per 5 seconds.
}
限制器不会在应用程序启动之间持久化。
同步限制器
TimedLimiter
遵循 SyncLimiter
协议。这意味着如果应触发放置的代码块,则会同步在您从队列中调用的队列上调用。 TimedLimiter
使用时间来限制。
还包含了 CountedLimiter
。它通过将限制作为一个 UInt
使用来作为运行代码块的最多次数。
SyncLimiter
协议有一个非常巧妙的扩展,让您可以做到这样
let funFactLimiter = CountedLimiter(limit: 2)
let funFact = funFactLimiter.execute { () -> String in
// Do real things to get a fun fact from a list
return "Hi"
}
现在funFact
是一个String?
。它只是你从代码块中返回的任何值的可选。如果代码块未运行,返回的值将是nil
。
当然,你也可以创建自己的SyncLimiter
!
异步限制器
包含了一个AsyncLimiter
。你也可以自己创建一个。这个内置的异步限制器是DebouncedLimiter
。当用户键入时制作网络请求或其他响应非常频繁事件的任务非常适用。
界面略有不同
let searchLimiter = DebouncedLimiter(limit: 1, block: performSearch)
func textDidChange() {
searchLimiter.execute()
}
由于它引用一个实例方法,你需要在初始化器中设置限制器,但基本思路是这样的。在这个配置下,代码块每秒最多被调用一次。
很简单!
安装
Carthage
Carthage是推荐安装Rate Limit的方法。在你的Cartfile中添加以下内容
github "soffes/RateLimit"
CocoaPods
在你Podfile
中添加以下内容
pod "RateLimit"
然后运行pod install
。