小结RunLoop
2016-03-31 11:34
295 查看
Core Foundation中关于RunLoop的5个类
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
以上这些类都属于C语言
1.CFRunLoopRef
这里指的就是你要设置的是哪个RunLoop
可以通过
CFRunLoopGetCurrent()获取当前RunLoop
CFRunLoopGetMain()获取主线程RunLoop
2.CFRunLoopModeRef
系统默认注册了5个Mode,但实际上我们自己开发程序用的不过两个而已:
kCFRunLoopDefaultMode:App的默认Mode,通常主线程实在这个Mode下进行的
UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动
Mode之间的切换
依旧拿上次的图说,同一时间只能切换到一个mode工作。
3.CFRunLoopSourceref
可以理解为是事件源(像点击事件)
根据堆栈分类有两种:
Source0:处理App内部事件,App自己负责管理
Source1:由RunLoop和内核进行管理
4.CFRunLoopTimerRef
如果只是调用了NSTimer,系统会自动将其添加到当前RunLoop的NSDefaultRunLoopMode中
当然你也可以自己使用addTimer方法进行模式的修改
与第二条CFRunLoopMode进行了结合,不过还是那句话,同一时间只能有一个模式
5.CFRunLoopObserverRef
Observer是观察者,能够监听RunLoop的状态改变
可以观察到以下这些状态
总体逻辑图:
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
以上这些类都属于C语言
1.CFRunLoopRef
这里指的就是你要设置的是哪个RunLoop
可以通过
CFRunLoopGetCurrent()获取当前RunLoop
CFRunLoopGetMain()获取主线程RunLoop
2.CFRunLoopModeRef
系统默认注册了5个Mode,但实际上我们自己开发程序用的不过两个而已:
kCFRunLoopDefaultMode:App的默认Mode,通常主线程实在这个Mode下进行的
UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动
Mode之间的切换
依旧拿上次的图说,同一时间只能切换到一个mode工作。
3.CFRunLoopSourceref
可以理解为是事件源(像点击事件)
根据堆栈分类有两种:
Source0:处理App内部事件,App自己负责管理
Source1:由RunLoop和内核进行管理
4.CFRunLoopTimerRef
- (void)timer1 { //调用了scheduledTimer返回的定时器,已经自动被添加到当前runLoop中,而且是NSDefaultRunLoopMode NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES]; //修改模式 [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; } - (void)run { NSLog(@"run"); }
如果只是调用了NSTimer,系统会自动将其添加到当前RunLoop的NSDefaultRunLoopMode中
当然你也可以自己使用addTimer方法进行模式的修改
与第二条CFRunLoopMode进行了结合,不过还是那句话,同一时间只能有一个模式
5.CFRunLoopObserverRef
Observer是观察者,能够监听RunLoop的状态改变
- (void)observer { //添加observer CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { NSLog(@"----监听到RunLoop状态改变-----%zd",activity); }); //添加观察者,监听RunLoop的状态 CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode); //释放Observer CFRelease(observer); }
可以观察到以下这些状态
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) { kCFRunLoopEntry = (1UL << 0),//即将进入Loop kCFRunLoopBeforeTimers = (1UL << 1),//即将处理timer kCFRunLoopBeforeSources = (1UL << 2),//即将处理source kCFRunLoopBeforeWaiting = (1UL << 5),//即将进入休眠 kCFRunLoopAfterWaiting = (1UL << 6),//从休眠中唤醒 kCFRunLoopExit = (1UL << 7),//即将退出Loop kCFRunLoopAllActivities = 0x0FFFFFFFU//所有状态 };
总体逻辑图:
相关文章推荐
- linux 查看文件夹个数
- nginx反代mogilefs实现海量小文件存储
- Docker 容器中“TERM environment variable not set.”问题解决
- linux 安装库 编译提示-lcrypto 无法链接,缺少 crypto 库
- 全面解析Linux 内核 3.10.x - initramfs 启动流程
- Openstack 源码修改,实现nova boot 创建的虚拟机支持USB 重定向
- zabbix 监控jvm
- struts2中怎样做不用重启tomcat
- 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
- [随手记]Android import org.apache.commons.codec.binary.Base64
- linux远程下载文件 的两种方法之 ftp命令和scp命令
- __declspec(property...)函数象属性那样使用
- Linux 中查看网口流量的利器 -- sar
- linux下mysql的卸载、安装全过程
- linux nfs挂载
- 使用Jenkins Pipeline插件和Docker打造容器化构建环境
- Linux文档的压缩与打包
- Linux手动添加swap分区
- Linux第六周学习总结——进程额管理和进程的创建
- openssl证书生成