MessageThrottle
MessageThrottle 是一个轻量级、简单的 Objective-C 消息频率控制库。您可以选择按实例或按类控制现有方法。它是通过 Objective-C 运行时开发的开箱即用的函数节流/防抖实现。有关节流和防抖之间的视觉解释,请参阅此演示。
📚 文章
🌟 功能
- 易于使用。
- 保持代码清晰
- 保留所有参数。
- 支持实例、类和元类。
- 支持三种模式:节流(首先)、节流(最后)和防抖。
- 规则集中管理。
- 规则自我管理。
- 确保方法在指定的条件下调用。
- 持久化规则。
🔮 示例
要运行示例项目,请克隆仓库并运行 MTDemo 目标。
🐒 如何使用
以下示例展示了如何将 - [ViewController foo:]
消息的转发频率限制为每秒 100 次。
Stub *s = [Stub new];
MTRule *rule = [s limitSelector:@selector(foo:) oncePerDuration:0.01]; // returns MTRule instance
要更精细地控制规则,可以使用 mt_limitSelector:oncePerDuration:usingMode:onMessageQueue:alwaysInvokeBlock:
。
您也可以从创建 MTRule
开始。
Stub *s = [Stub new];
// You can also assign `Stub.class` or `mt_metaClass(Stub.class)` to `target` argument.
MTRule *rule = [[MTRule alloc] initWithTarget:s selector:@selector(foo:) durationThreshold:0.01];
rule.mode = MTModePerformLast; // Or `MTModePerformFirstly`, ect
[rule apply];
您可以使用 alwaysInvokeBlock
来确保方法在指定的条件下调用。上面的示例代码将在其第一个参数等于 "1970" 时立即调用消息。顺便说一下,alwaysInvokeBlock
没有参数,或者参数列表之前有一个更多的 MTRule
。
当您不需要限制 foo:
方法时,应调用 discard
方法。
[rule discard];
注意:MTRule
是自我管理的。如果规则的 target
是对象实例,则当 target
被释放时,MTRule
将自动丢弃自己。
某些规则可能具有较大的 durationThreshold
。您可以将属性 persistent
设置为 YES
,并通过调用 savePersistentRules
方法将它们保存在磁盘上。这些持久化规则将在 MTEngine
类加载后应用。当接收到终止通知时,将自动调用 savePersistentRules
。
rule.persistent = YES;
[MTEngine.defaultEngine savePersistentRules];
MTRule
表示消息节流的规则,它包含消息的发送策略和频率。
可以将实例或(元)类分配给target
属性。当您将实例分配给target
时,MessageThrottle只会限制发送到该实例的消息。如果想要限制类方法,只需使用mt_metaClass()
获取其元类,并将元类分配给target
。实例target
的规则不会相互冲突,优先级高于类target
的规则。
注意:一个消息可以在类继承层次结构中只拥有一个规则。例如,如果有一个消息- [Stub foo:]
的规则,那么不能再添加另一个消息- [SuperStub foo:]
的规则。 PS:假设Stub
是SuperStub
的子类。
MTRule
还定义了执行选择器的模式。在MTMode
中定义了三种模式:MTModePerformFirstly
、MTModePerformLast
和MTModePerformDebounce
。此演示显示了节流和防抖之间的区别。
默认模式是MTModePerformDebounce
。在durationThreshold
期间收到其他消息时,MTModePerformDebounce
将重新启动计时器。因此,至少需要有一个延迟durationThreshold
。
MTModePerformDebounce:
start end
| durationThreshold(old) |
@----------------------@---------------------->>
| |
ignore will perform at end of new duration
|--------------------------------------------->>
| durationThreshold(new) |
start end
MTModePerformFirstly
将执行第一条消息,在durationThreshold
期间忽略所有后续消息。
MTModePerformFirstly:
start end
| durationThreshold |
@-------------------------@----------@---------------@---------------->>
| | | |
perform immediately ignore ignore ignore
MTModePerformLast
在结束时间执行最后一条消息。请注意,不立即执行消息,延迟最多为durationThreshold
。
MTModePerformLast:
start end
| durationThreshold |
@-------------------------@----------@---------------@---------------->>
| | | |
ignore ignore ignore will perform at end
当使用MTModePerformLast
或MTModePerformDebounce
时,您可以指定消息执行的调度队列。默认情况下,messageQueue
是主队列。MTModePerformLast
和MTModePerformDebounce
模式也会使用最后参数来执行消息。
MTEngine
是一个单例类。它管理所有消息节流的规则。可以使用applyRule:
方法应用规则或更新已存在的旧规则。使用它的discardRule:
方法取消规则。还有一个只读属性allRules
,用于获取当前应用程序中所有规则。
📲 安装
CocoaPods
CocoaPods是Cocoa项目的依赖管理器。您可以使用以下命令安装它
$ gem install cocoapods
要使用CocoaPods将MessageThrottle集成到您的Xcode项目中,请在您的Podfile
中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '11.0'
use_frameworks!
target 'MyApp' do
pod 'MessageThrottle'
end
需要将“MyApp”替换为您的项目名称。
然后,运行以下命令
$ pod install
Carthage
Carthage是一个分布式依赖管理器,它构建您的依赖关系并为您提供二进制框架。
您可以使用Homebrew安装Carthage,以下为命令
$ brew update
$ brew install carthage
要使用Carthage将MessageThrottle集成到您的Xcode项目中,请在您的Cartfile
中指定它
github "yulingtianxia/MessageThrottle"
运行carthage update
以构建框架,并将构建的MessageThrottleKit.framework
拖放到您的Xcode项目中。
用户手册
只需将“MessageThrottle”文档文件夹拖动到您的项目中。
❤️ 贡献
- 如果您需要帮助或想提出一般性问题,请打开一个 issue。
- 如果您发现了一个错误,请打开一个 issue。
- 如果您有功能请求,请打开一个 issue。
- 如果您想贡献,请提交一个 pull 请求。
👨💻 作者
yulingtianxia, [email protected]
👮♂️ 许可证
MessageThrottle 可在 MIT 许可证下使用。有关更多信息,请参阅 LICENSE 文件。