RunLoop
-
RunLoop是事件接收和分发机制的一个实现,是线程相关的基础框架的一部分,一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。
-
RunLoop本质是一个 do-while循环,没事做就休息,来活了就干活。与普通的while循环是有区别的,普通的while循环会导致CPU进入忙等待状态,即一直消耗cpu,而RunLoop则不会,RunLoop是一种闲等待,即RunLoop具备休眠功能。 RunLoop的作用
-
保持程序的持续运行
-
处理App中的各种事件(触摸、定时器、performSelector)
-
节省cpu资源,提供程序的性能,该做事就做事,该休息就休息 2、RunLoop和线程的关系
image.jpeg image.jpeg image.jpeg image.jpeg
RunLoop和mode是一对多
mode和Item也是一对多
image.jpeg
相关面试题
面试题1当前有个子线程,子线程中有个timer。timer是否能够执行 并进行持续的打印?
不可以,因为子线程的runloop默认不启动, 需要runloop run启动,需要将上述代码改成下面这样
image.jpeg
面试题2:RunLoop和线程的关系
- 每个线程都有一个与之对应的RunLoop,所以RunLoop与线程是一一对应的,其绑定关系通过一个全局的DIctionary存储,线程为key,runloop为value。
- 线程中的RunLoop主要是用来管理线程的,当线程的RunLoop开启后,会在执行完任务后进行休眠状态,当有事件触发唤醒时,又开始工作,即有活时干活,没活就休息
- 主线程的RunLoop是默认开启的,在程序启动之后,会一直运行,不会退出
- 其他线程的RunLoop默认是不开启的,如果需要,则手动开启 面试3:NSRunLoop 和 CFRunLoopRef 区别
- NSRunLoop是基于CFRunLoopRef面向对象的API,是不安全的
- CFRunLoopRef是基于C语言,是线程安全的 面试5:以+scheduledTimerWithTimeInterval:的方式触发的timer,在滑动页面上的列表时,timer会暂停回调, 为什么?如何解决?
- timer停止的原因是因为滑动scrollView时,主线程的RunLoop会从NSDefaultRunLoopMode切换到UITrackingRunLoopMode,而timer是添加在NSDefaultRunLoopMode。所以timer不会执行
- 将timer放入NSRunLoopCommonModes中执行
网友评论