IOS RunLoop浅析 二
2016-03-30 08:52
645 查看
上一篇我们说了runloop 的几种模式,那么我们在模式中又要做些什么呢???
模式中有三个模块:
按照官方文档分类
Port-Based
Custom Input
Cocoa Perform Selector
按照函数调用栈,Source的分类
Source0:非基于Port的
Source1:基于Port的,通过内核和其他线程通信,接受,分发系统事件。
(这里没什么太大用,剩下的Source概念我就不介绍了有兴趣可以去别处查查)
状态有以下几种
所监听的状态:
kCFRunLoopEntry = (1UL << 0), 1
kCFRunLoopBeforeTimers = (1UL << 1), 2
kCFRunLoopBeforeSources = (1UL << 2), 4
kCFRunLoopBeforeWaiting = (1UL << 5), 32
kCFRunLoopAfterWaiting = (1UL << 6), 64
kCFRunLoopExit = (1UL << 7), 128
kCFRunLoopAllActivities = 0x0FFFFFFFU
我们可以选择监听不同的状态实现不同的操作
下面的代码中是实现见天所有状态
演示效果为:
![](https://images2015.cnblogs.com/blog/913387/201603/913387-20160330084416316-699966381.gif)
仔细观察不难发现当运行到最后我不在操作时,日志停止打印。
这是为什么呢???仔细观察所有状态便知道,因为到了休眠状态。
为了证明这一观点 我们一直点击屏幕测试一下。
![](https://images2015.cnblogs.com/blog/913387/201603/913387-20160330084814488-771833172.gif)
(测试结果后面一直输出32实际上是不符合逻辑的,因为我在一直*快速*点击。)
(正常情况应该会出现64等)
因为没有其他状态存在所以一直为休眠状态(具体流程我会在下一篇进行介绍)
掌握好这一点对开发会有很大好处。
没有看到第一篇的可以在文章结尾处点击上一篇即可。
模式中有三个模块:
事件源(输入源) Source
Source:按照官方文档分类
Port-Based
Custom Input
Cocoa Perform Selector
按照函数调用栈,Source的分类
Source0:非基于Port的
Source1:基于Port的,通过内核和其他线程通信,接受,分发系统事件。
(这里没什么太大用,剩下的Source概念我就不介绍了有兴趣可以去别处查查)
观察者 Observer
观察者的作用便是监听runloop中正在执行的状态状态有以下几种
所监听的状态:
kCFRunLoopEntry = (1UL << 0), 1
kCFRunLoopBeforeTimers = (1UL << 1), 2
kCFRunLoopBeforeSources = (1UL << 2), 4
kCFRunLoopBeforeWaiting = (1UL << 5), 32
kCFRunLoopAfterWaiting = (1UL << 6), 64
kCFRunLoopExit = (1UL << 7), 128
kCFRunLoopAllActivities = 0x0FFFFFFFU
我们可以选择监听不同的状态实现不同的操作
下面的代码中是实现见天所有状态
// // ViewController.m // CX RunLoop浅析 // // Created by ma c on 16/3/29. // Copyright © 2016年 xubaoaichiyu. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //添加observe /* 所监听的状态 kCFRunLoopEntry = (1UL << 0), 1 kCFRunLoopBeforeTimers = (1UL << 1), 2 kCFRunLoopBeforeSources = (1UL << 2), 4 kCFRunLoopBeforeWaiting = (1UL << 5), 32 kCFRunLoopAfterWaiting = (1UL << 6), 64 kCFRunLoopExit = (1UL << 7), 128 kCFRunLoopAllActivities = 0x0FFFFFFFU */ CFRunLoopObserverRef observe = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { NSLog(@"监听到runloop-- %zd",activity); }); //添加观察者 CFRunLoopAddObserver(CFRunLoopGetCurrent(), observe, kCFRunLoopDefaultMode); } @end
演示效果为:
![](https://images2015.cnblogs.com/blog/913387/201603/913387-20160330084416316-699966381.gif)
仔细观察不难发现当运行到最后我不在操作时,日志停止打印。
这是为什么呢???仔细观察所有状态便知道,因为到了休眠状态。
为了证明这一观点 我们一直点击屏幕测试一下。
![](https://images2015.cnblogs.com/blog/913387/201603/913387-20160330084814488-771833172.gif)
(测试结果后面一直输出32实际上是不符合逻辑的,因为我在一直*快速*点击。)
(正常情况应该会出现64等)
因为没有其他状态存在所以一直为休眠状态(具体流程我会在下一篇进行介绍)
掌握好这一点对开发会有很大好处。
定时器 NSTimer
由于第一篇是用定时器简单介绍了runloop因此在这里就不加以追诉。没有看到第一篇的可以在文章结尾处点击上一篇即可。
相关文章推荐
- iOS开发--处理不等高TableViewCell的小花招
- 实现自己的iOS小咖秀
- iOS 项目收集
- iOS开发-即时通讯第三方-环信SDK集成
- iOS runtime自动归档问题
- iOS:开发者中心证书创建流程
- iOS中动态更新补丁策略JSPatch运用基础二
- IOS中CocoaPods 从安装到使用全解
- iOS开发中@property的属性weak nonatomic strong readonly等介绍
- iOS监听模式系列之关于delegate(代理,委托)的学习
- iOS 成员变量,实例变量,属性变量的区别,联系
- iOS类别(category)不能添加成员变量但是可以添加属性的问题
- iOS友盟推送
- iOS学习之OC语————对于自定义构造方法的认识与理解
- IOS RunLoop浅析 一
- iOS --NSAttributedString
- iOS开发-从iTunes中下载手机应用,并获取应用图标
- ios 滚动视图,滚动广告,无限循环轮播
- [iOS 静态库]在iOS中创建静态库
- iOS个人整理35-即时通信1 XMPP openfire 登录注册