时间:2021-05-20
前言
最近抽空闲的时间看了一些算法相关的,刷刷LeetCode。实在感觉脑子不好使。想到前段时间处理了一个挺好玩的问题——限制GCD调用的频率。后来扩展到了限制函数调用。这里顺便总结一下。
本来想写详细点,太懒了,这里只给出了基本思路和核心代码。
思路
为了达到限制调用频率的目的,很容易联想到throttle,也就是限流。最开始是从网络节流了解到这个基础名词的。简单来理解就是:对要处理的数据进行流量处理,限制频率。不是很清楚的可以看看这篇文章iOS编程中throttle那些事
大致有三种:
1、一定时间内,以最早的数据为准。
2、一定时间内,以最后的数据为准。
3、如果时间在一定时间内,有新的数据来了,从新开始计时。
一定时间内很简单的可以通过比较上次时间和当前时间来比较,剩下的就是如何取消之前已经产生的数据。这里有两个思路,一个是用最新的覆盖掉之前的数据,二是直接把老数据删掉,重新构造新的数据。
可能看起来不清楚,现在就用实际例子来说。
GCD Throttle
需要用到的作料:dispatch_source_t,dispatch_queue_t,dispatch_source_set_timer
我们可以比较简单的通过dispatch_source_t来实现GCD的Throttle。得益于GCD提供了取消source的方法dispatch_source_cancel。
核心思路就是延迟特定时间调用一个任务,如果这段时间来新的任务了就取消掉之间的,如果时间到了就执行任务,需要创建一个对象、或者数组来保存之前的sourcer。
代码很简单:
dispatch_source_t source = scheduledSources[key]; //如果有了就取消掉,达到忽略中间的,调用最新的if (source) { dispatch_source_cancel(source);}dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_timer(source, dispatch_time(DISPATCH_TIME_NOW, threshold * NSEC_PER_SEC), DISPATCH_TIME_FOREVER, 0); dispatch_source_set_event_handler(source, ^{ block(); dispatch_source_cancel(source); [scheduledSources removeObjectForKey:key]; }); dispatch_resume(source);基本的思路就是这样。如果想要写得更加通用一些,就是把需要变化的参数化就可以了。
常规的消息发送Throttle
如果想解决常规发送消息进行Throttle。这个挺麻烦的。因为RuntTime没有直接提供取消方法执行方式。
这里有几个思路:
给类添加一个新的方法 fixed_selector,对应实现为 rule.selector 的 IMP。
利用 Objective-C runtime 消息转发机制,将 rule.selector 对应的 IMP 改成 _objc_msgForward 从而触发调用 forwardInvocation: 方法。
将 forwardInvocation: 的实现替换为自己实现的 IMP,并在自己实现的逻辑中将 invocation.selector 设为 fixed_selector。并限制 [invocation invoke] 的调用频率。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解objective-c中interface与protocol的作用以前对Objective-C中的interface,即头文件的作用一直不太清楚。最近看了一
Swift和Objective-C混编注意事项整理:前言Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低
在Objective-C中延迟执行还是很常见的需求,通常有如下几种方式可供选择:performSelector:想要延迟调用某个方法:[selfperformS
JSPatch是GitHub上一个开源的框架,其可以通过Objective-C的run-time机制动态的使用JavaScript调用与替换项目中的Object
TIOBE公布了2021年4月的编程语言排行榜。编程语言Objective-C在本月跌出了TIOBE指数前20名。TIOBE方面认为,Objective-C在短