文档章节

关于NSTimer和runloop的一点关系

RainOrz
 RainOrz
发布于 2017/04/12 17:11
字数 417
阅读 15
收藏 0

iOS中默认开启的就是main函数里边的那个主线程runloop,iOS所有程序得以正产运行就是靠这个,所以当你开启nstimer的时候默认是可以运行的,因为默认会把nstimer添加到主线程

//添加到默认主线程 自动开启
    //一次
    [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerAction:) userInfo:nil repeats:NO];
    //周期性
    [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    //

主线程资源有限,当你想把natimer放到子线程该怎么做呢?

 NSRunLoop *loop = [NSRunLoop currentRunLoop];
    NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:1] interval:5 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    [loop addTimer:timer forMode:NSDefaultRunLoopMode];
    [loop run];

切记此处要把runloop的run方法打开,要不然是不会运行的

runloop是事件接收和分发机制的一个实现。


Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。

 在iOS多线程中,每一个线程都有一个Runloop,但是只有主线程的Runloop默认是打开的,其他子线程也就是我们创建的线程的Runloop默认是关闭的,需要我们手动运行。我们可以通过[NSRunLoop currentRunLoop]来获得当前线程的Runloop,并且调用[runloop addTimer:timer forMode:NSDefaultRunLoopMode]方法将定时器添加到Runloop中,最后一定不要忘记调用Runloop的run方法将当前Runloop开启,否则NSTimer永远也不会运行。

运行结果如下

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 视app启动视频
下一篇: SDWebImage的原理
RainOrz
粉丝 8
博文 135
码字总数 89239
作品 0
青浦
程序员
私信 提问
iOS 底层以及数据问题深入研究(1)

几周前有人问了我几个问题,我觉得自己能回答出来,但是深入的时候才发现自己还是浮在水表明,没有真正的去理解。所以将理解后易忽略的问题总结并记录下来 1 RunLoop --关于NStimer添加到NSR...

李周
2017/08/26
0
0
iOS PerformSelector面试题总结

最近在面试的过程中才发现太多没有注意的细节,每一个问题问到最后都是在怀疑人生中度过... 正好趁着工作敲定了之后将performSelector相关的细节总结一番。 基础用法 performSelecor响应了O...

李周
2018/04/02
0
0
iOS刨根问底-深入理解RunLoop

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/80957665 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时也是...

KenshinCui
2018/07/08
0
0
iOS刨根问底--深入理解Runloop

概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时也是很多常见技术的幕后功臣。尽管在平时多数开发者很少直接使用RunLoop,但是理解RunLoop可以帮助开发者更好的利用多线程...

_小迷糊
2018/12/10
0
0
iOS学习——浅谈RunLoop

  RunLoop的字面意思是运行循环、跑圈,一个App启动后能一直执行,就是因为启动后进入了一个循环,在这个循环中不断监听各种状态、手势动作,并做出相应的响应。这个循环就是我们今天要探究...

mukekeheart
2018/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GlusterFS的再次节点重置和恢复

采用Ubuntu+ZFS+GlusterFS的存储集群,其中一个节点再次出现故障,gluster volume status显示为N/A状态。 检查网络,发现原来的IP地址 10.1.1.193发生了改变(估计被DHCP重新分派地址了),导...

openthings
29分钟前
5
0
BOM与正则表达式

BOM BOM的全称叫做Browser OjbectModel 浏览器对象模型,它定义了操作浏览器的接口。 BOM对象包括:Window、History、Navigator、Screen和Location。但是由于浏览器厂商的不同,BOM对象的兼容...

Panda-Q
30分钟前
1
0
牵头函数

箭头函数表达式的语法比函数表达式更短,并且没有自己的this,arguments,super或new.target。这些函数表达式更适用于那些本 来需要匿名函数的地方,并且它们不能用作构造函数。 首先:我们先...

wshining
35分钟前
1
0
mysql把一个数据库中的数据复制到另一个数据库中的表 2个表结构相同

首页 问题 全部问题 经济金融 企业管理 法律法规 社会民生 科学教育 健康生活 体育运动 文化艺术 电子数码 电脑网络 娱乐休闲 行政地区 心理分析 医疗卫生 精选 知道专栏 知道日报 知道大数据...

linjin200
36分钟前
1
0
python redis操作

redis命令:http://blog.csdn.net/yhl27/article/details/9936189 python redis: 干货 http://www.cnblogs.com/wangtp/p/5636872.html http://doc.redisfans.com/ http://developer.51cto.......

stys35
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部