参考: http://www.aichengxu.com/view/4329711

1. 定义:
其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer),能让线程不被系统终止
一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法)
RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop

runloop常用的三种模式:
NSDefaultRunLoopMode:runloop默认的模式,程序启动模式主线程的runloop就是在NSDefaultRunLoopMode模式下运行的。
UITrackingRunLoopMode:runloop在用户点击或触摸屏幕时,会自动切换到该模式。
NSRunLoopCommonModes:指标记为common modes的所有模式,即前两者的集合。

2. 作用
可以使用runloop, 在一个子线程中长期监控某个事件

- (void)viewDidLoad {
    [super viewDidLoad];
    // 开启一个线程让它执行run方法,如果run方法过了,线程就会死掉
    self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    [self.thread start];
}
- (void)run {
    NSLog(@"run----%@",[NSThread currentThread]);
    // 给线程执行的方法添加运行时,添加source1 和timer,让这个进程不死,并在没有任务时进入休眠状态
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
    // 可以在这里添加要循环执行的代码
}
上面的代码如果不加runloop,run方法执行完,self.thread这个线程就会被释放

也可以让某些事件(行为、任务)在特定模式下执行(例如轮播广告,在用户拖动图片的时候,不去循环轮播图片(不做定时任务),等用户松开手指时才开始计算循环周期(开始定时任务))

- (void)timer {
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    // 定时器只运行在NSDefaultRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}

- (void)run {
    NSLog(@"----run");
}

如上代码,在 NSDefaultRunLoopMode模式下添加一个定时器任务(每2秒打印一次run这个方法),程序一启动后,是NSDefaultRunLoopMode,所以一直打印,当用户触摸屏幕上的UIScrollView时,此时自动切换到UITrackingRunLoopMode,定时器停止工作,当用户松开手时,定时器重新启动,run方法继续执行打印。如果将
如果将上面代码加入到NSRunLoopCommonModes,那么不管用户是否触摸UIScrollView,定时器都会正常工作。

iOS runloop初步学习的更多相关文章

  1. iOS runtime 初步学习

    注: 在Xocde5之后, 使用运行时方法需要进行2步设置1. 在Build Setting中搜索'msg', 设置'Strict Checking' 为 NO2. 使用需要导入头文件 #import ...

  2. IOS MenuController初步了解

    IOS MenuController初步了解 默认情况下有以下控件已经支持MenuController. UITextField UITextView UIWebView 让其他控件也支持MenuCo ...

  3. json2.js的初步学习与了解

    json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...

  4. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  5. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...

  6. EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库

    前提:搭建成功codefirst相关代码,参见EF Codefirst  初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...

  7. 初步学习python

    自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...

  8. Git的初步学习

    前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...

  9. 语法分析器初步学习——LISP语法分析

    语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...

随机推荐

  1. AIX 5L 系统管理技术 —— 存储管理——卷组

    卷组 在安装系统时,就会创建一个rootvg卷组.包含自带硬盘(内置硬盘)和系统逻辑卷,一个系统只能有一个rootvg卷组.一般情况下rootvg卷组最好只包含自带硬盘. 一.创建卷组 在创建卷组之前 ...

  2. 关于Java内存模型的解读

    运行时数据区域 运行时数据区包括以下五大部分:方法区.堆.虚拟机栈.本地方法栈.程序计数器.其中,方法区和堆是由所有线程共享的数据区,其他区域是线程隔离的数据区. 程序计数器: 程序计数器是一块较小的 ...

  3. Linux 挂载U盘

    命令模式下挂载,图形的一般可以自动识别. #fdisk -l      --查看linux 硬盘分区 这个/dev/sdg1 就是我的U盘了,这里挂载的fat格式的 # mount /dev/sdg1 ...

  4. 我的第一个FluentNHibernate例子

    刚刚接触NHibernate和FluentNHibernate,所以最好的方法是从一个简单的例子入手. 开发环境考虑到是实际情况还有好多朋友没有用VS2015,就用VS2013withUpdate5吧 ...

  5. 在macbook上搭建ubuntu工作环境

    工作环境需要:ubuntu12.04.gcc 4.4.7.vim.source insight.git. 1. 制作启动盘 首先需要制作一个能从苹果电脑启动的ubuntu启动盘: 在苹果电脑的终端中输 ...

  6. eclipse安装svn

  7. vsftpd.conf

    引用:http://www.linuxidc.com/Linux/2012-08/67389.htm 研究嵌入式开发,开始使用的是Linux平台,用的是Ubuntu环境,但是发现Ubuntu的图形界面 ...

  8. 移动设备如何打开RMS加密的文档

    关键字:RMS. AZure RMS.IPhone.Android.Office365.Sharepoint.Exchange 最近总是碰到要求用苹果手机及安卓手机阅读RMS加密文档的需求,经过查找相 ...

  9. [已解决] MAVEN安装代码到本地库,安装jar, source, javadoc的方式

    mvn install:install-file -Dfile=a.jar -DgroupId=gid -DartifactId=aid -Dversion=0.0.1 -Dpackaging=jar ...

  10. Java 基础接口练习题

    编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void prin ...