快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

Objective-C如何限制函数调用的频率-创新互联

这篇文章给大家分享的是有关Objective-C如何限制函数调用的频率的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

创新互联专注于河北企业网站建设,成都响应式网站建设公司,商城系统网站开发。河北网站建设公司,为河北等地区提供建站服务。全流程按需网站建设,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

思路

为了达到限制调用频率的目的,很容易联想到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没有直接提供取消方法执行方式。

这里有几个思路:

  • 因为上面已经实现了GCD Throttle调用,那么用GCD的方式把常规的方法调用包装一层就可以实现了。

  • 利用Runtime消息转发,转发到自定义的方法进行延迟处理。具体逻辑可以看看

给类添加一个新的方法 fixed_selector,对应实现为rule.selector的 IMP。

利用 Objective-C runtime 消息转发机制,将rule.selector对应的 IMP 改成 _objc_msgForward 从而触发调用 forwardInvocation: 方法。

将 forwardInvocation: 的实现替换为自己实现的 IMP,并在自己实现的逻辑中将invocation.selector设为 fixed_selector。并限制 [invocation invoke] 的调用频率。

感谢各位的阅读!关于“Objective-C如何限制函数调用的频率”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:Objective-C如何限制函数调用的频率-创新互联
网页网址:http://6mz.cn/article/dhihih.html

其他资讯