IOS RunLoop浅析 二

IOS RunLoop浅析 二

上一篇我们说了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<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
复制代码

演示效果为:

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

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

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

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

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

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

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

定时器 NSTimer

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值