IOS RunLoop浅析 二
Posted 旭宝爱吃鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS RunLoop浅析 二相关的知识,希望对你有一定的参考价值。
上一篇我们说了runloop 的几种模式,那么我们在模式中又要做些什么呢???
模式中有三个模块:
事件源(输入源) Source
Source:
按照官方文档分类
Port-Based
Custom Input
Cocoa Perform Selector
按照函数调用栈,Source的分类
Source0:非基于Port的
Source1:基于Port的,通过内核和其他线程通信,接受,分发系统事件。
(这里没什么太大用,剩下的Source概念我就不介绍了有兴趣可以去别处查查)
观察者 Observer
观察者的作用便是监听runloop中正在执行的状态
状态有以下几种
所监听的状态:
kCFRunLoopEntry = (1UL << 0),
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5),
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
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), kCFRunLoopBeforeTimers = (1UL << 1), kCFRunLoopBeforeSources = (1UL << 2), kCFRunLoopBeforeWaiting = (1UL << 5), kCFRunLoopAfterWaiting = (1UL << 6), kCFRunLoopExit = (1UL << 7), kCFRunLoopAllActivities = 0x0FFFFFFFU */ CFRunLoopObserverRef observe = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { NSLog(@"监听到runloop-- %zd",activity); }); //添加观察者 CFRunLoopAddObserver(CFRunLoopGetCurrent(), observe, kCFRunLoopDefaultMode); } @end
演示效果为:
仔细观察不难发现当运行到最后我不在操作时,日志停止打印。
这是为什么呢???仔细观察所有状态便知道,因为到了休眠状态。
为了证明这一观点 我们一直点击屏幕测试一下。
因为没有其他状态存在所以一直为休眠状态(具体流程我会在下一篇进行介绍)
掌握好这一点对开发会有很大好处。
定时器 NSTimer
由于第一篇是用定时器简单介绍了runloop因此在这里就不加以追诉。
没有看到第一篇的可以在文章结尾处点击上一篇即可。
以上是关于IOS RunLoop浅析 二的主要内容,如果未能解决你的问题,请参考以下文章