从字面上讲就是运行循环
它内部实现就是do「」while,在这个循环内部不断的处理各种任务
一个线程对应一个Runloop,主线程的Runloop默认启动,子线程的Runloop是手动启动
保持程序持续运行,处理各种各样的事情,有事运行,无事休息,节省cpu资源,提高程序性能
iOS中有2套API来访问和使用RunLoop
Foundation:NSRunLoop
Core Foundation:CFRunLoopRef
Runloop与线程
-
每条线程都有唯一的一个与之对应的RunLoop对象
-
主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建
-
RunLoop在第一次获取时创建,在线程结束时销毁
获得RunLoop对象
- Foundation
[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象
- Core Foundation
CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
CFRunLoopGetMain(); // 获得主线程的RunLoop对象
Core Foundation中关于RunLoop的5个类
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
CFRunLoopModeRef代表RunLoop的运行模式。
一个RunLoop包含若干个Mode,每个Mode又包含若干个(set)Source/(array)Timer/(array)Observer
每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作CurrentMode
如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入
这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响
mode主要是用来指定事件在运行循环中的优先级的,分为:
• NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
• UITrackingRunLoopMode:ScrollView滑动时会切换到该Mode
• UIInitializationRunLoopMode:run loop启动时,会切换到该mode
• NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合
苹果公开提供的Mode有两个:
• NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
• NSRunLoopCommonModes(kCFRunLoopCommonModes)
Runloop的应用
- NSTimer
- ImageView显示
- PerformSelector
- 常驻线程
- 自动释放池
runloop的mode作用是什么?
mode主要是用来指定事件在运行循环中的优先级的,分为:
• NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
• UITrackingRunLoopMode:ScrollView滑动时会切换到该Mode
• UIInitializationRunLoopMode:run loop启动时,会切换到该mode
• NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合
苹果公开提供的Mode有两个:
• NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
• NSRunLoopCommonModes(kCFRunLoopCommonModes)
如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。当我们滚动的时候,也希望不调度,那就应该使用默认模式。但是,如果希望在滚动时,定时器也要回调,那就应该使用common mode。
NSTimer使用时的注意事项
注意timer添加到runloop时应该设置为什么mode
• 注意timer在不需要时,一定要调用invalidate方法使定时器失效,否则得不到释放
在开发中如何使用RunLoop?什么应用场景?
在子线程中开启一个定时器
在子线程中进行一些长期监控
可以控制定时器在特定模式下执行
可以添加Observer监听RunLoop的状态,比如监听点击事件的处理(在所有点击事件之前做一些事情)