对于定时器NSTimer,我们大家都不会陌生,在使用的时候,我们常常会遇到一些坑,例如:在Scrollview拖动时,timer会暂停;在子线程中如何创建一个定时器等。针对于一些我们所遇到的坑,我来总结下NSTimer。

一、前提条件

  1. NSTimer的运行条件:timer能够成功的运行,它所依赖的环境是RunLoop,也就说timer必须存在一个RunLoop中,它才能够正常运行(关于RunLoop,点击这里)。
  2. NStimer的创建
  3.     // timer常用的创建方式有如下两种
    NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> repeats:<#(BOOL)#> block:<#^(NSTimer * _Nonnull timer)block#>];
    NSTimer *timer2 = [NSTimer timerWithTimeInterval:<#(NSTimeInterval)#> repeats:<#(BOOL)#> block:<#^(NSTimer * _Nonnull timer)block#>];
    // timer1的创建方式,默认会将timer1加入当前的RunLoop中,且该RunLoop的模式为kCFRunLoopDefaultMode。
    // timer2的创建方式,没有默认添加进入哪个RunLoop,需要自己手动添加进RunLoop中,且需要手动选择RunLoop的模式。

二、解释常见的坑。

  1. 关于Scrollview拖动时,Timer暂停:当Scrollview拖动时,Timer所在的RunLoop进入UITrackingRunLoopMode的模式,所以需要改变Timer所在RunLoop的模式,否则在UITrackingRunLoopMode模式下,RunLoop在运行时不会去检测Timer是否需要触发,从而导致定时器Timer暂停。
  2. 关于子线程中创建定时器:每一条线程都会有其对应的RunLoop,主线程的RunLoop是默认开启,而子线程的RunLoop是需要我们手动开启,所以在子线程中创建了定时器Timer没反应,是因为没有开启子线程的RunLoop而导致的。
  3. 关于NSTimer不精准的问题:由于Timer运行受困于RunLoop,而RunLoop在运行时,处理的事件不仅仅只有Timer,还有很多source等事件,在此情景下,RunLoop没办法保证准时的去检测Timer并触发,所以NSTimer的精准度存在误差。(想了解更加精准的定时器,点击这里

NSTimer整理总结的更多相关文章

  1. AJ整理问题之:NSTimer准确吗?

    NSTimer准确吗? 问题:NSTimer准确吗?如果不准确,怎么办? NSTimer的工作原理:假设timer每隔一段时间执行一次事件,很均匀的(例如每隔多少秒),假设在某一时刻cpu在做疯狂的大 ...

  2. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  3. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  4. UWP学习目录整理

    UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...

  5. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  6. SQL Server 常用内置函数(built-in)持续整理

    本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...

  7. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  8. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  9. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

随机推荐

  1. Java职业生涯规划

    java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...

  2. cell单选

    先上图给看看效果 cell单选逻辑就是取出上一个选中的cell 设置图片为默认图片 在取出点击的cell 设置图片为选中图片即可 废话不多说直接上代码 p.p1 { margin: 0.0px 0.0 ...

  3. Visual Studio将std::cout输出到Output窗口

    在debug的时候,输出到Output需要使用OutputDebugString函数,但部分库的log是采用std::cout输出的,需要用控制台(黑窗)程序来查看输出.有没有一种使用GUI和Outp ...

  4. Linux文件权限和访问模式

    为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限,每个文件都拥有下面三种权限: 所有者权限:文件所有者能够进行的操作 组权限:文件所属用户组能够进行的操作 外部权限(其他权限):其他用户 ...

  5. Fedora 安装gcc gcc-c++

    Fedora本身没有自带gcc 和 g++编译器,所以需要我们自己去安装,步骤如下: 1.切换到root用户(或者跳过这个步骤,直接在下面命令前面加上 sudo) su root 2.安装gcc yu ...

  6. hbase 的体系结构

    hbase的服务体系遵从的是主从结构,由HRegion(服务器)-HRegionServer(服务器集群)-HMaster(主服务器)构成, 从图中能看出多个HRegion 组成一个HRegionSe ...

  7. list for循环中删除元素

    Iterator.remove() is safe, you can use it like this: List<String> list = new ArrayList<> ...

  8. jQuery的DOM操作详解

    DOM(Document Object Model-文档对象模型):一种与浏览器, 平台, 语言无关的规则, 使用该接口可以轻松地访问页面中所有的标准组件DOM操作的分类 核心-DOM: DOM Co ...

  9. 增删改查--windows下mysql客户端--表的使用

    >>>>>>>>>>>>>>>>>>>> selet 5种子句之where常用运 ...

  10. 正定矩阵(positive definite matrix)

    设M是n阶方阵,如果对任何非零向量z,都有zTMz> 0,其中zT 表示z的转置,就称M正定矩阵. 正定矩阵在合同变换下可化为标准型, 即对角矩阵. 所有特征值大于零的对称矩阵也是正定矩阵.   ...