Runloop初识

2017-05-17  本文已影响0人  似奔跑的野马

一、作用:

1.保证程序持续运行

处理APP中的各种事件(如触摸事件、定时器事件、Selector事件)

节约cup资源,提高程序性能。该做事做事,该休息休息

每个线程都有一个唯一与之对应的runloop 对象

二、获取runloop

[NSRunLoopcurrentRunLoop];都会获取也当前线程管理的runloop ,默认情况下,子线程是没有开启runloop的。

2.runloop 需要手动开启 ,可以调用 run  方法。

3.不同的runloop运行对应不同的mode 模式

kCFRunLoopDefaultMode 默认主线程在这个mode下执行

UITrackingRunLoopModel 界面跟踪model,用于scrollView 跟踪触摸滑动,保证界面滑动不受其他model影响。

UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用

GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到

kCFRunLoopCommonModes  是通用模式,是一个占位标记(kCFRunLoopDefaultMode和UITrackingRunLoopModel)本身不是真正的model.

4.程序启动后,默认开启一个主运行循环,进行处理事件,保证程序持续运行,不退出。

三、souce分类

按调用栈分为:

1>source0  非基于port

2>source1基于port,通过内核和其他线程通信,接收、分发系统事件。

四、什么是runloop

1.字面就是运行循环,本质就do-while,循环处理各种事件(如timer、控件的点击、拖拽、port)

2.每个线程都有一个唯一与之对应的runloop,主线程由系统自己创建,不断循环处理各种事件,子线程的runloop需要获取,并且启动,调用对应的run方法。

3.runloop对应的mode如果没有timer、、source0或者source1时, 就会立即退出。(如果单有观察者也会退出)

4.gcd的dispatch_after 延迟执行不受 mode影响。

子线程的runloop默认不启动

runloop的使用场景:

1.开启一个常驻线程(让一个字线程不进入消亡状态,等待其他线程发来消息,处理其他事件)

iOS 利用RunLoop创建一个常驻线程

子线程中开启一个定时器

子线程中进行一个长期监控

2.使timer 运行在不同的mode模式下

3.设置特定的mode,处理不同的任务、行为

autoreleaspool什么时候销毁?

通过observer监听runloop的状态,当进入休眠的时候,销毁当前的autoreleaspool

五、runloop 处理逻辑

Runloop源码地址

上一篇 下一篇

猜你喜欢

热点阅读