MessageThrottle 1.4.2

MessageThrottle 1.4.2

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2022 年 7 月

杨晓宇 维护。



MessageThrottle

CI Status Version Carthage compatible codecov Codacy Badge License Platform CocoaPods CocoaPods Twitter Follow

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:假设StubSuperStub的子类。

MTRule还定义了执行选择器的模式。在MTMode中定义了三种模式:MTModePerformFirstlyMTModePerformLastMTModePerformDebounce此演示显示了节流和防抖之间的区别。

默认模式是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

当使用MTModePerformLastMTModePerformDebounce时,您可以指定消息执行的调度队列。默认情况下,messageQueue是主队列。MTModePerformLastMTModePerformDebounce模式也会使用最后参数来执行消息。

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 文件。