Runloop?

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

你可能感兴趣的:(Runloop?)