创建DISPATCH_SOURCE_TYPE_TIMER派发源-程序员宅基地

技术标签: DISPATCH_SOURCE_TYPE  object_c2.0  Mac osX  ios  

定时器dispatch source定时产生事件,可以用来发起定时执行的任务,如游戏或其它图形应用,可以使用定时器来更新屏幕或动画。你也可以设置定时器,并在固定间隔事件中检查服务器的新信息。
所有定时器dispatch source都是间隔定时器,一旦创建,会按你指定的间隔定期递送事件。你需要为定时器dispatch source指定一个期望的定时器事件精度,也就是leeway值,让系统能够灵活地管理电源并唤醒内核。例如系统可以使用leeway值来提前或延迟触发定时器,使其更好地与其它系统事件结合。创建自己的定时器时,你应该尽量指定一个leeway值。
就算你指定leeway值为0,也不要期望定时器能够按照精确的纳秒来触发事件。系统会尽可能地满足你的需求,但是无法保证完全精确的触发时间。
当计算机睡眠时,定时器dispatch source会被挂起,稍后系统唤醒时,定时器dispatch source也会自动唤醒。根据你提供的配置,暂停定时器可能会影响定时器下一次的触发。如果定时器dispatch source使用 dispatch_time 函数或 DISPATCH_TIME_NOW 常量设置,定时器dispatch source会使用系统默认时钟来确定何时触发,但是默认时钟在计算机睡眠时不会继续。
如果你使用 dispatch_walltime 函数来设置定时器dispatch source,则定时器会根据挂钟时间来跟踪,这种定时器比较适合触发间隔相对比较大的场合,可以防止定时器触发间隔出现太大的误差。
下面是定时器dispatch source的一个例子,每30秒触发一次,leeway值为1,因为间隔相对较大,使用 dispatch_walltime 来创建定时器。定时器会立即触发第一次,随后每30秒触发一次。 MyPeriodicTask 和 MyStoreTimer 是自定义函数,用于实现定时器的行为,并存储定时器到应用的数据结构。
虽然定时器dispatch source是接收时间事件的主要方法,你还可以使用其它选择。如果想在指定时间间隔后执行一个block,可以使用  dispatch_after 或 dispatch_after_f  函数。这两个函数非常类似于dispatch_async,但是只允许你指定一个时间值,时间一到就自动提交block到queue中执行,时间值可以指定为相对或绝对时间。
dispatch_source_t createTimerDispatchSource(uint64 interval,
                                            uint64 leeway,
                                            dispatch_queue_t queue,
                                            dispatch_block_t block)
{
    //1:创建派发源
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    if(timer){
        //2:配置定时器派发源,第二参数设置第一次触发时间,你可以使用dispatch_walltime函数,也可以使用dispatch_time或DISPATCH_TIME_NOW
        dispatch_source_set_timer(timer, dispatch_walltime(NULL, interval), interval, leeway);
        //3:设置事件响应体
        dispatch_source_set_event_handler(timer, block);
        //4:启动派发源
        dispatch_resume(timer);
    }
    return timer;
}
int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
        
        NSLog(@"==========定时器派发源===========");
        __block int count = 0;
        dispatch_source_t timer = createTimerDispatchSource(3ull * NSEC_PER_SEC,//事件间隔时间
                                                            0ull * NSEC_PER_SEC,//偏差,0偏差最好(虽然达不到)
                                                            dispatch_get_main_queue(),
                                                            ^{
                                                                NSLog(@"on timer");
                                                                count++;
                                                            });
        
        while (YES) {
            if (count == 3) {
                dispatch_source_cancel(timer);
                break;
            }
            
            [[NSRunLoop currentRunLoop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
        }
        
    }
    
    return 0;
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qianlima210210/article/details/54800817

智能推荐

批量编译lua源码为lua字节码_lua编译为源码字节-程序员宅基地

@echo offif exist out rd /s /q outmkdir outsetlocal enabledelayedexpansioncls:inputset input=:set /p input= “源码文件夹:”if “%input%”==":" goto inputif not exist “%input%” goto inputset “input=%input:”=%":outputset output=:set /p output= “输出文件夹:”i_lua编译为源码字节

LL-verilog 1000HZ分频为1HZ使用三个十位计数器合成-程序员宅基地

使用三个十进制实现千进制计数并分频module top_module (input clk,input reset,output OneHertz,output [2:0] c_enable); //wire [9:0] q1,q2,q3;//三个十位计数器bcdcount counter0 (clk, reset, c_enable[0],q1);bcdcount counter1 (clk, reset, c_enable[1],q2);bcdcount counter2 (clk

如何阅读别人的代码---c、c++程序学习_如何快速入手别人的c++项目-程序员宅基地

[ C/C++ ] 程序学习--如何阅读别人的代码++++++++++++第一章: 导论++++++++++++1.要养成一个习惯, 经常花时间阅读别人编写的高品质代码.2.要有选择地阅读代码, 同时, 还要有自己的目标. 您是想学习新的模式|编码风格|还是满足某些需求的方法.3.要注意并重视代码中特殊的非功能性需求, 这些需_如何快速入手别人的c++项目

Redis常用手册-程序员宅基地

Redis常用手册 http://www.cnblogs.com/zcy_soft/archive/2012/09/21/2697006.htmlhttp://www.redisdoc.com/en/latest/目录(使用CTRL+F快速查找命令):...

CRMEB/V4.4标准版打通版商城源码小程序公众号H5+App商城源码_www_5438xiazai的博客-程序员宅基地

Emlog新版导航源码带用户中心环境要求:PHP+MYSQLPHP版本7.0+这是一款装逼制作的一款微信小程序源码我原本想数一下有多少个模板,但是刀客一直翻啊翻,翻了多久都忘记了,都还没到底所以说可以想象模板有多少,另外呢里面的模板还是可meedu知识付费解决方案v4.5.4源码下载解决方案是一个以php进行开发的网校建站系统。MeEdu知识付费/在线培训解决方案PC网校/H5/小程序/APP全话费充值的PHP网站源码,非常完整,我到手之后修复了充值时金额显示错误的问题,充值对接了Z支付的免签接口。可以设置

Java面试题(大内)3_银河系的一束光的博客-程序员宅基地

面试题)三级目录1.我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?2.Java语言中使用哪两个类封装大数据类型?分别有什么作用?.&和&&的区别?4. 队列和栈是什么,列出它们的区别?5.continue和 break有什么区别?6.String与StringBuilder的区别?7.说出几点 Java 中使用 Collections 的最佳实践8.介绍Collection框架的结构9.final, finally, fi

随便推点

ad中按钮开关的符号_零基础之常见按钮开关,图文一目了然!-程序员宅基地

在工业控制中,按钮是电工作业中必不可少的电气元件。下面,就跟随电工大师兄认识一下常用的按钮开关吧!一、按钮的功能按钮是一种用人体某一部分(一般为手指或手掌)施加力而操作、并具有弹簧储能复位的控制开关,是一种最常用的主令电器。按钮的触头允许通过的电流较小,一般不超过5A。因此,一般情况下它不直接控制主电路(大电流电路)的通断,而是在控制电路(小电流电路)中发出指令信号,控制接触器、继电器等..._pcb板上开关符号

flutter 实现自适应、自动换行、相对布局_flutter 两段不同的文案 自适应换行-程序员宅基地

两个控件,为了实现文本2紧靠文本1右侧。如果随着文本1变长,会将文本2顶到右侧,最终文本1继续边长会自动换行。Android实现:<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <TextView android:layout_w.._flutter 两段不同的文案 自适应换行

Docker Alpine容器中安装Python和pip3(附Dockerfile模板)_alpine 安装pip-程序员宅基地

Step 1: Docker拉取alpine镜像docker pull alpine:latestStep 2: 直接运行镜像,命名为alpine(下面的命令 'alpine'记得修改为自己的容器名称)docker run -d --name=alpine alpine:latestStep 3:修改Alpine镜像源docker exec -it alpine sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /e..._alpine 安装pip

关于python+selenium中定位弹框的处理_1.确定弹框的类型 div弹框 alert弹框 新建页签窗口弹框-程序员宅基地

1.确定弹框的类型div弹框 alert弹框 新建页签窗口弹框2.div弹框div弹框其实就是不用做什么处理,定位的方法跟普通的定位方法是一致的。但是有时候弹出窗口后,我们已经能看到弹框了,但是一直定位不到,这里的处理就是应该让整个页面都加载完毕后再来定位就没有问题了。比如:self.basecommon.click(self.page_sbr['zrkxj_ele'],s..._1.确定弹框的类型 div弹框 alert弹框 新建页签窗口弹框

java 笔试 2016_Java笔试题2016最新版.doc-程序员宅基地

目录一. Java基础部分91、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?92、说说&和&&的区别。93、在JAVA中如何跳出当前的多重嵌套循环?94、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?106、用最有效率的方法算出2乘以8等於几?107、请设计一个一百亿的计算器108、使用final关键字修饰...

安全linux环境:理解文件和权限(二)-Symbolic Permissions-程序员宅基地

ls -l-rw-r--r--. 1 root root 0 Aug 3 20:33 file.txtdrwx------. 3 jwang jwang 74 Aug 1 10:20 jwangdrwxrwxr-x. 3 root sales 50 Aug 3 19:53 sales然后创建以下文件和目录:mkdir itdepartmentmkdir itdepartmen...