在开发过程中,我们常常需要一定延迟功能来满足项目需求,简单整理如下

NSTimer、CADisplayLink、GCD。接下来我就一一介绍它们的用法。
一、NSTimer
1. 创建方法
1 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];
• TimerInterval : 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法
• target : 需要执行方法的对象。
• selector : 需要执行的方法
• repeats : 是否需要循环
2. 释放方法
1 [timer invalidate];
• 注意 :
调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。
3. 特性
•存在延迟
不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。
• 必须加入Runloop
使用上面的创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式创建定时器,就必须手动加入Runloop:
1 NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
2 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
二、CADisplayLink
1. 创建方法
1 self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];    
2 [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
2. 停止方法
1 [self.displayLink invalidate];  
2 self.displayLink = nil;
3         
4 /**当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。**/
3. 特性
•屏幕刷新时调用
CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒
• 延迟
◦ iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。
◦ 如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。
•使用场景
从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。
4. 重要属性
• frameInterval
NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。
• duration
readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。
三、GCD方式
•执行一次
• 1 double delayInSeconds = 2.0;
• 2 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
• 3 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
• 4     //执行事件
• 5 });
•重复执行
• 1 NSTimeInterval period = 1.0; //设置时间间隔
• 2 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
• 3 dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
• 4 dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒执行
• 5 dispatch_source_set_event_handler(_timer, ^{
• 6      //在这里执行事件
• 7 });
• 8 dispatch_resume(_timer); 

转载于:https://www.cnblogs.com/shineDongEr/p/5566153.html

iOS项目中常见定时器相关推荐

  1. XamarinSQLite教程Xamarin.iOS项目中打开数据库文件

    XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...

  2. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件

    XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的"前 ...

  3. 在Xamarin.iOS项目中使用预设数据库

    在Xamarin.iOS项目中使用预设数据库 当开发者准备好一个预设数据库文件后,就可以将这个数据库文件添加到创建的项目中了.本节将分别在Xamarin.iOS和Xamarin.Android项目中使 ...

  4. 项目中常见错误总结一

    项目中常见错误总结一 以下是在项目开发过程中会遇到的错误总结,会不定期进行更新: 1.json-lib 的maven dependency遇到的问题: 项目中要用到json-lib,mvnreposi ...

  5. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  6. iOS项目中的网络请求和上下拉刷新封装

    代码地址如下: http://www.demodashi.com/demo/11621.html 一.运行效果图 现在的项目中不可避免的要使用到网络请求,而且几乎所有软件都有上下拉刷新功能,所以我在此 ...

  7. js 读取json文件_JavaScript 项目中常见配置文件介绍

    原文地址:https://github.com/whinc/blog/issues/14 本文介绍一些前端项目的通用配置及相关资源,以便你了解项目中常见配置的含义以及配置方式. .gitignore ...

  8. iOS开发中常见的一些异常

    iOS开发中常见的一些异常 参考文章: (1)iOS开发中常见的一些异常 (2)https://www.cnblogs.com/feng9exe/p/7244936.html 备忘一下.

  9. iOS开发过程中常见错误问题及解决方案

    iOS开发过程中常见错误问题及解决方案 参考文章: (1)iOS开发过程中常见错误问题及解决方案 (2)https://www.cnblogs.com/xjf125/p/9494737.html 备忘 ...

最新文章

  1. mysql 拼接sql批量执行_Mysql 学习笔记之 SQL 执行过程
  2. asp.net中缓存的使用介绍一
  3. CloudStack设计思想
  4. 视觉slam发展史--从开始到未来
  5. 牛客 contest893 G-Truthman or Fakeman
  6. MongoDB3.4 版本新节点同步的一点惊喜
  7. java 线程同步condtion_Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信...
  8. 织梦无子栏目时禁止调用同级栏目
  9. lnp和mysql分开安装_毕业设计之LNP+DISCUZ +分离的数据库操作
  10. php数字取反,[转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)
  11. PHP批量插入多条数据到Mysql报错:Mysql Prepared statement contains too many placeholders
  12. 【C/C++ 】C++库类大全
  13. 史上最全的微信小程序代码大全分享
  14. python 基于onvif协议 修改摄像头分辨率亮度等操作(window版本
  15. pdf转图片 jpg png
  16. 常见元件贴片焊接不良的解决方法
  17. Ubuntu 16.04系统下出现搜狗拼音安装失败问题
  18. 详解opencv的HOG描述子维度数目的计算原理
  19. 手机重装android系统,安卓手机系统怎样重装
  20. 引用作为函数的返回值

热门文章

  1. 经验 | 计算机视觉顶会上的灌水文都有哪些特征?
  2. 《Python编程从入门到实践》记录之类的使用
  3. Google AI面试题
  4. linux权限介绍,Linux的权限介绍
  5. .interface文件怎么看啊_【干货】Java关键字合集,看这篇就够了!
  6. Java有哪些常用的转换类,JavaSE——常用类、类型转换
  7. java 框架架构图_java框架之Spring 核心框架体系结构
  8. 携带token的ajax请求方法封装
  9. jQuery ajax模板及各参数介绍
  10. 小汤学编程之jQuery学习day01——简介、入门、选择器