文档章节

关于NSTimer和runloop的一点关系

RainOrz
 RainOrz
发布于 2017/04/12 17:11
字数 417
阅读 12
收藏 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永远也不会运行。

运行结果如下

 

© 著作权归作者所有

共有 人打赏支持
RainOrz
粉丝 7
博文 104
码字总数 80823
作品 0
青浦
程序员
iOS 底层以及数据问题深入研究(1)

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

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

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

李周
04/02
0
0
RunLoop 的深入学习

RunLoop 是什么? RunLoop 是和线程紧密相关的一个基础组件。顾名思议就是循环运行。按照 OC 的思路,RunLoop 其实就是一个对象,这个对象管理了其需要处理的事件和消息并提供一个入口函数来...

满脸胡茬的小码农
2017/12/24
0
0
对,我就是RunLoop(代码也会讲故事系列)

"请问你是?" "不用请问,我就是RunLoop" “你好,我是iOS开发者,我听说过你,不过抱歉,对你的名声我早有耳闻,只是不很熟悉。” ”嗯,不难理解。毕竟我在幕后,你在台前,我是说句不妄言...

CoderDancer
2017/06/12
0
0
iOS底层原理总结 - RunLoop

面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑? Runloop和线程的关系? timer 与 Runloop 的关系? 程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要...

xx_cc
04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea新建springCloud项目(5)- 订单服务

1.创建订单api,如下: 2.创建订单实现逻辑 3.新建订单、订单商品表 -- 订单 create table `order_master` ( `order_id` varchar(32) not null, `buyer_name` varchar(32) not null comment......

monroeCode
2分钟前
0
0
游戏开发经验谈(二):对战类全球服游戏的设计与实现

上篇文章《游戏开发经验谈(一):游戏架构里隐藏的五个坑及其应对方案》,我们主要讲解了游戏架构设计当中隐藏的一些坑及其应对方案,错过的小伙伴可以回溯之前的内容。本期内容,将会重点介...

UCloudTech
12分钟前
0
0
Mysql基本语法

一.联合主键 drop table CONTENT_AND_CATALOG;CREATE TABLE `tobebetter`.`CONTENT_AND_CATALOG` ( `ID` VARCHAR(120) NOT NULL , `CONTENT_ID` VARCHAR(120) , `CA......

我是菜鸟我骄傲
13分钟前
0
0
179. centos7 安装mariadb

1. centos7 中安装mariadb 1.1 执行安装 centos7 自带了mariadb yum -y install mariadb mariadb-server 1.2 启动mariadb systemctl start mariadb 1.3 设置开机启动 systemctl enable maria......

Lucky_Me
20分钟前
0
0
【AI实战】动手训练自己的目标检测模型(YOLO篇)

在前面的文章中,已经介绍了基于SSD使用自己的数据训练目标检测模型(见文章:手把手教你训练自己的目标检测模型),本文将基于另一个目标检测模型YOLO,介绍如何使用自己的数据进行训练。 ...

雪饼
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部