服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - Objective-C限制函数调用的频率详解

Objective-C限制函数调用的频率详解

2021-06-11 14:06纸简书生 C/C++

这篇文章主要给大家介绍了关于Objective-C限制函数调用的频率的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

最近抽空闲的时间看了一些算法相关的,刷刷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。

代码很简单:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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] 的调用频率。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://www.cocoachina.com/ios/20171215/21550.html

延伸 · 阅读

精彩推荐
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07