Runloop 官方文档
Runloop
和定时器的关系
上篇文章说过,Runloop
监听所有的事件中包括 时钟
NSTimer
定时器要想能运行起来,,不管你是哪种方式创建定时的器,必须要将定时器添加到当前的Runloop
中,有些创建的定时器默认添加到了当前的Runloop
中,有些创建方法需要程序员手动添加方可运行
-
定时器最好放在子线程里去操作,因为就算你用NSRunLoopCommonModes模式,如果定时器的执行的任务里有耗时操作,它会影响ui的处理,在子线程里用NSDefaultRunLoopMode模式即可,因为子线程不会影响主线程
常用的方法
runloop和线程有关
[NSRunLoop currentRunLoop]:获取当前线程的runloop
[NSRunLoop mainRunLoop]:获取主线程的runloop
[[NSRunLoop currentRunLoop] run]; 本质是个死循环
子线程中的runloop需要手动开启,在子线程中这句代码之后的执行是不会执行的,因为它是死循环
UIKit框架是否 线程安全:大部分不是安全的,如果出现了多条线程访问,就会出现资源抢夺,所以就出现一个约定,用主线程去访问ui,ui所有的操作都在主线程,如果在子线程对ui进行操作,可能会出现乱七八糟的问题
而且uikit用nonatomic 效率也高
所谓的常驻线程:就是在自线程里[[NSRunLoop currentRunLoop] run];
模式
- NSDefaultRunLoopMode:默认模式
- UITrackingRunLoopMode:简单的理解为UI模式
- NSRunLoopCommonModes:占位符,并不是真正的runloop模式,它只是按位运算为NSDefaultRunLoopMode|UITrackingRunLoopMode
runloop的source

source
是指一切事件的来源,timer
也是一个source
source
:事件源(输入源),按照函数调用栈分为两种事件源:source0
,source1
source0
:非系统内核事件
source1
:系统内核事件
函数调用栈:指的是函数掉用的顺序
网友评论