面试总结 - RunLoop

就是运行时循环,一个程序能一直运行就是基于runloop。
每个线程如果想继续运行,不被释放,就必须有一个runloop来不停的跑圈,以来处理线程里面的各种事件和消息,主线程默认是开启一个runloop。也就是这个runloop才能保证我们的程序正常的运行。子线程是默认没有开启runloop的。

我们创建的程序不需要显示的创建runloop;每个线程,包括程序的主线程都有与之相应的runloop对象,主线程会自行创建并运行runloop,runloop处理的输入事件有两种不同的来源:输入源inputSource和定时源timer Source,输入源传递异步消息,通常来自于其他线程或者程序。定时源则传递同步消息,在特定时间或者一定的时间间隔发生。

除了处理input sources,runloop也会产生一些关于本身行为的通知。注册成为runloop的observer,可以接受到一些notification,做一些特定的处理。

一个runloop mode就是input sources,timer和observers的集合。每次执行runloop,都需要制定一个mode。在此期间,只有与该mode关联的source才会被监管和传递他们的事件,同样只有相关的observer被通知。 新建的自定义mode,至少需要一个inputsource或者timers 或者observers。

系统默认注册了5个mode:

1.kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行的。
*2.UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响。
*3.UIInitialLizationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后就不再使用了。
4.GSEventReceiveRunLoopMode:接受系统时间的内部Mode,通常用不到。
5.kCFRunLoopCommonModes:这个是占位的Mode,没有实际作用。
iOS对以上5个中model进行了封装
NSDefaultRunLoopMode(kCFRunLoopDefaultMode);
NSRunLoopCommonModes(kCFRunLoopCommonModes);

使用:

可以添加一个observer,来监听runloop的状态变化
kCFRunLoopEntry,即将进入Loop
kCFRunLoopBeforeTimers,即将处理 Timer
kCFRunLoopBeforeSources,即将处理 Source
kCFRunLoopBeforeWaiting,即将进入休眠
kCFRunLoopAfterWaiting,刚从休眠中唤醒
kCFRunLoopExit,即将退出Loop

发布了218 篇原创文章 · 获赞 19 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/songzhuo1991/article/details/104883438
今日推荐