• 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因此在这里就不加以追诉。

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

        

  • 相关阅读:
    HTML_项目符号使用图片
    字符串查找和替换接口
    AOP代理分析
    3星|董藩《房地产的逻辑》:应该鼓励开发商多盖房而不是惩罚开发商
    2.5星|郎咸平《拯救世界的经济学》:各发达国家与中国的福利政策、经济干预政策的前世今生
    3.5星|科特勒《营销革命4.0》:打造无缝衔接的线上和线下体验
    3星|《韩国式资本主义》:财阀祸害韩国,韩国需要正义的资本主义
    4星|《特朗普时代的全球化战略》:管理学界和管理者可能严重低估了核心管理实践的价值
    2星|《内容创业》:知识付费行业的公开资料整理汇编
    3星|《身边的博弈》:10年旧书,博弈论科普和习题讲解
  • 原文地址:https://www.cnblogs.com/wuyuxin/p/7045576.html
Copyright © 2020-2023  润新知