1.何为runloop,有什么用?
runloop 就是一个运行循环,用于保持程序的持续运行,处理各种事件(触摸事件,定时器等),节省cpu资源,提高性能(要让马儿跑,还要马儿不吃草)
2.runloop的用法?
oc中有两套API可以访问和使用runloop
(1)Foundation
NSRunloop
//获取当前线程的runloop
[NSRunloop currentRunloop];
//获取主前程的runloop
[NSRunloop mainRunloop];
(2)Core Foundation
CFRunloopRef
CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象CFRunLoopGetMain(); // 获得主线程的RunLoop对象
3.线程与runloop
(1).每条线程都有唯一的与之对应的RunLoop对象。
(2).主线程的RunLoop已经创建好了,而子线程的需要手动创建。(也就是说子线程的RunLoop默认是关闭的,因为有时候开了个线程但却没有必要开一个RunLoop,不然反而浪费了资源。 )
(3).RunLoop在第一次获取时创建,在线程结束时销毁。
4.RunLoop相关类
CFRunLoopRef //
CFRunLoopModeRef //RunLoop的运行模式。
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
1.CFRunLoopModeRef代表的是RunLoop的运行模式。
2.一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source/Timer/Observer。
3.每次调用 RunLoop 的主函数时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode。 4.如果需要切换 Mode,只能退出 Loop,再重新指定一个 Mode 进入。这样做主要是为了分隔开不同组的 Source/Timer/Observer,让其互不影响。
CFRunLoopModeRef
kCFRunLoopDefaultMode //App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode //界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
UIInitializationRunLoopMode // 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode // 接受系统事件的内部 Mode,通常用不到
kCFRunLoopCommonModes //这是一个占位用的Mode,不是一种真正的Mode
5.使用runloop注意点
在NSTimer中使用runloop 是时的用法
- (IBAction)ButtonDidClick:(id)sender {
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerTest) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}
- (void)timerTest {
NSLog(@"timerTest----");
}
在scrollview中使用runloop时的用法:使用NSRunLoopCommonModes
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerTest) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
参考链接:https://www.jianshu.com/p/2d3c8e084205