RunLoop
作用:
1.保持程序运行
2.处理app各种事件
3.节省cpu资源,提高性能
两个API
NSRunLoop CFRunLoopRef
RunLoop与线程
1.每条线程都有唯一的与之对应的RunLoop对象
2.主线程的RunLoop已经创建好了,而子线程的需要手动创建.
3.RunLoop在第一次获取时创建,在线程结束时销毁
RunLoop相关类
CFRunLoopRef
CFRunLoopModeRef
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
系统默认注册了5个mode
kCFRunLoopDefaultMode // 默认Mode, 通常主线程是在这个Mode下运行
UITrackingRunLoopMode // 界面跟踪Mode, 用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
UIInitializationRunLoopMode // 在App刚启动时候进入第一个Mode, 启动后不在使用
GSEventReceiveRunLoopMode // 接受系统事件的内部Mode, 通常用不到
kCFRunLoopCommonModes // 占位Mode, 不是真正的Mode
CFRunLoopSourseRef
sourse0:非基于port的
sourse1:基于port的
CFRunLoopObserverRef
可以监听runloop的状态改变
Timer
scheduledTimer方法会自动添加到当前的runloop里面去, 而且runloop的运行模式kCFRunLoopDefaultMode
scrollView的情况下使用Timer
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
在滑动的使用RunLoop切换到UITrackingRunLoopMode模式, 每次调用RunLoop的主函数时,只能指定其中一个Mode
这个Mode被称作CurrentMode.所以定时器就不起作用了
CFRunLoopRef就是RunLoop, 而SourceRef, TimerRef, ObserverRef是CFRunLoopRef的内容, 而ModeRef指的是mode的属性
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
作者:Jabber_YQ
链接:https://www.jianshu.com/p/2d3c8e084205
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Jabber_YQ
链接:https://www.jianshu.com/p/2d3c8e084205
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。