博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS RunLoop浅析 二
阅读量:4710 次
发布时间:2019-06-10

本文共 1957 字,大约阅读时间需要 6 分钟。

上一篇我们说了runloop 的几种模式,那么我们在模式中又要做些什么呢???

模式中有三个模块:

事件源(输入源) 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
*)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

演示效果为:

仔细观察不难发现当运行到最后我不在操作时,日志停止打印。

这是为什么呢???仔细观察所有状态便知道,因为到了休眠状态。

为了证明这一观点 我们一直点击屏幕测试一下。

(测试结果后面一直输出32实际上是不符合逻辑的,因为我在一直*快速*点击。)

(正常情况应该会出现64等)

因为没有其他状态存在所以一直为休眠状态(具体流程我会在下一篇进行介绍)

掌握好这一点对开发会有很大好处。

定时器 NSTimer

由于第一篇是用定时器简单介绍了runloop因此在这里就不加以追诉。

没有看到第一篇的可以在文章结尾处点击上一篇即可。

 

    

 

转载于:https://www.cnblogs.com/xubaoaichiyu/p/5335184.html

你可能感兴趣的文章
[BT5]信息收集1-1 Dnsenum
查看>>
tf.reduce_mean
查看>>
IDA相关下载
查看>>
[Codeforces] #441 div.2
查看>>
BusHelper
查看>>
数据整合构思
查看>>
pandas所占内存释放
查看>>
MySQL关于TYPE和ENGIN的一点问题
查看>>
工作中的一些问题总结
查看>>
母猪的产后护理——一些零碎的知识
查看>>
你所不知的 CSS ::before 和 ::after 伪元素用法
查看>>
POJ 3666 Making the Grade
查看>>
Codeforces Round #352 (Div. 2) A. Summer Camp 水题
查看>>
Entity Framework 更新数据库 datetime 类型的问题 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值。...
查看>>
Vue.js 基础学习之自定义指令
查看>>
[Hadoop]-HDFS-架构篇
查看>>
异常(Exception)
查看>>
解决JS事件冒泡兼容性问题
查看>>
jQuery getScript跨域
查看>>
Python基础(一)
查看>>