RunLoop机制理解
一、浅识RunLoop
RunLoop在开发中我们一直在用,但是没有注意他。要想理解RunLoop,首先我们需要先了解一下程序运行机制。
程序运行机制:我们都知道OC是运行时语言,也就是说对象的类型是在程序运行的时候确定的。并调用类与对象相应的方法。但是最终代码的执行始终是面向过程的。线程也是一样:一个线程从开始代码执行,到结束代码销毁。app如何实现这样的机制:app从运行开始一直处于待命状态,接收到事件之后执行操作,操作完成后继续等待相应,直到程序终止运行。这样的管理线程执行任务的机制就是RunLoop机制。线程在执行中的休眠和激活就是由RunLoop对象进行管理的。
二、RunLoop与线程的关系
RunLoop是用来管理线程的。每一个线程都有一个RunLoop对象。可以通过具体的方法去获得。但是需要注意:虽然每一个线程都可以获取RUnLoop对象,但是并不是每一个线程中都有实例对象,我们可以这样理解:如果我们不获取RunLoop,这个RunLoop就不存在,我们获取时,如果不存在,就会去创建。在主线程中,这个MainRunLoop是默认创建并运行激活的。
三、NSRunLoop
NSRunLoop是Cocoa框架中的类,与之对应的是在Core Fundation中有一个CFRunLoopRef类。这两者的区别是前者不是线程安全的,而CFRunLoopRef是线程安全的。
1、获取主线程的NSRunLoop
//获取主线程的NSRunLoop
+(NSRunLoop *)mainRunLoop;
2、获取当前线程的NSRunLoop
//获取当前线程的RunLoop:有的话就直接获取,没有的话就自动创建
+(NSRunLoop *)currentRunLoop;
3、NSRunLoop的执行模式
//获取当前runloop的执行模式
@property(readonly,copy)NSString *currentMode;
//两种执行模式
//默认的模式,接收大部分输入源的响应
NSString *const NSDefaultRunLoopMode;
//多种模式的集合
NSString *const NSRunLoopCommonModes;
4、获取RunLoop的CFRunLoopRef对象
//获取RunLoop的CFRunLoopRef对象
-(CFRunLoopREF)getCFRunLoop;
5、将定时器添加到RunLoop中
//将定时器添加到runloop中
-(void)addTimer:(NSTimer *)timer forMode:(NSString *)mode;
6、获取下个响应时间
-(NSDate *)limitDateForMode:(NSString *)mode;
定时器的执行,其实并不是按照时间段额间隔进行调用方法,而是在定时器注册到RunLoop中后,RunLoop会设置一个一个的时间点进行调用,例如,5,10,15,20等等。如果错过了某个时间点,定时器并不会延迟调用,而是直接等待下一个时间点调用,所以定时器并不是准确的。
7、在某个时间期限前接收相应
-(void)aceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate;
8、开始运行
-(void)run;
9、到某个时间点运行
-(void)runUntilDate:(NSDate *)limitDate;
10、在某个期限前运行
-(BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate;
11、
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode; 添加输入源端口到runloop中,NSPort对象可以理解为详细的载体,会传递消息与其代理。 - (void)removePort:(NSPort *)aPort forMode:(NSString *)mode; 将某个输入源端口移除
四、RunLoop的调用
一般情况下我们很少去显式调用或者启动RunLoop,但是下边的情况需要手动设置。
1、在分线程中使用定时器
定时器的实现是基于RunLoop的,平时我们使用定时器或许并没有对RunLoop做什么操作,那是因为主线程的RunLoop默认是开启运行的,如果我们进行如下操作:
-(void)viewDidLoad{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("myQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue,^{
NSTimer *timer = [NSTimer scheduledTimerWithTimerInterval: target:self selector:@selector(time) userInfo:nil repeats:YES];
});
}
-(void)time{
NSLog(@"runTimer");
}
此时运行,控制台不会输出runTimer。我们必须在线程中手动的执行如下代码:
[[NSRunLoop currentRunLoop] run];
这样定时器才可以正常工作。
2、当线程中使用如下的方法时
某些延迟函数和选择器在分线程中的使用,我们必须手动开始RunLoop
@interface NSObject (NSDelayedPerforming) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes; - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument; + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget; - (void)performSelector:(SEL)aSelector target:(id)target argument:(id)arg order:(NSUInteger)order modes:(NSArray *)modes; - (void)cancelPerformSelector:(SEL)aSelector target:(id)target argument:(id)arg;
- (void)cancelPerformSelectorsWithTarget:(id)target;
五、其他
输入源被注册到RunLoop中时会有方法进行remove。但是定时器没有remove,但是它的invalidate方法可以将其从RunLoop中移除。invalidate是重要的也是唯一的将定时器从RunLoop中注销的方法,所以如果我们创建了定时器,就一定要再不适用的时候调用invalidate方法。
六、附
参考自:http://my.oschina.net/u/2340880/blog/491966
RunLoop机制理解的更多相关文章
- android的事件分发机制理解
android的事件分发机制理解 1.事件触发主要涉及到哪些层面的哪些函数(个人理解的顺序,可能在某一层会一次回调其它函数) activity中的dispatchTouchEvent .layout中 ...
- ECshop中的session机制理解
ECshop中的session机制理解 在网上找了发现都是来之一人之手,也没有用自己的话去解释,这里我就抛砖引玉,发表一下自己的意见,还希望能得到各界人士的指导批评! 此session机制不需 ...
- Java ClassLoader加载机制理解 实际例子
针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...
- Java ClassLoader加载机制理解
今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...
- JavaWeb三大组件——过滤器的运行机制理解
过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...
- Runloop 深入理解(转)
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...
- storm的acker机制理解
转载请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6142356.html Storm 的拓扑有一些特殊的称为"acker"的任务,这 ...
- 【图解ASP.NET MVC运行机制理解-简易版】
很多盆友咨询ASP.NET MVC的机制.网上也有好多.但是都是相当深奥.看的云里雾里的.我今天抽空,整理个简易版本.把处理流程走一遍. 当然,这个只是处理请求的一部分环节.百度的面试题“客户端从浏览 ...
- (转)JAVA反射机制理解
JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...
随机推荐
- VIM配置相关记录
把一直使用中的vim配置做个GIT入库管理,也把之前积累在机器上的文档,做个汇总. https://github.com/wujuguang/kyvim 1. 安装完整版vim vi和vim的区别?在 ...
- [Code::Blocks] Install wxWidgets & openCV
The open source, cross platform, free C++ IDE. Code::Blocks is a free C++ IDE built to meet the most ...
- Transact-SQL 示例 - 使用脚本备份数据库的示例
在常规的数据库开发与维护的过程中,常常需要对数据库进行数据备份,最入门的办法就是使用SSMS图形化界面提供的数据库备份向导一步一步操作进行备份,这种方式虽然简单快捷但是日子久了就会觉得重复且繁琐.下面 ...
- 字符编码(ASCII,Unicode和UTF-8) 和 大小端
本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...
- 组合数学 - 母函数的运用 --- hdu 1709 :The Balance
The Balance Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Linq专题列表
什么是Linq? Linq(Language-Integrated Query),即语言集成查询.是微软的一项新技术,能够将查询功能直接引入.NET Framework3.5 所支持的编程语言(C#, ...
- HTML5 语义元素
返回目录 http://hovertree.com/h/bjaf/html5zixueji.htm 一个语义元素能够清楚的描述其意义给浏览器和开发者.无语义 元素实例: <div> 和 & ...
- Azure开发者任务之六:使用WCF Service Web Role
在本文中,我们将会在local development fabric上创建一个WCF服务角色,然后在一个控制台应用程序中使用它. WCF服务角色可以让我们创建一个WCF服务,并且把它托管在Window ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- 行转列一定要sum
--SELECT 姓名 ,-- 课程 ,-- 分数--FROM tb UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t --)