• 小结RunLoop


    Core Foundation中关于RunLoop的5个类
    1. CFRunLoopRef
    2. CFRunLoopModeRef
    3. CFRunLoopSourceRef
    4. CFRunLoopTimerRef
    5. CFRunLoopObserverRef

    以上这些类都属于C语言

    1.CFRunLoopRef

    这里指的就是你要设置的是哪个RunLoop

    可以通过

    CFRunLoopGetCurrent()获取当前RunLoop

    CFRunLoopGetMain()获取主线程RunLoop

    2.CFRunLoopModeRef

    系统默认注册了5个Mode,但实际上我们自己开发程序用的不过两个而已:

    kCFRunLoopDefaultMode:App的默认Mode,通常主线程实在这个Mode下进行的

    UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动

    Mode之间的切换

    依旧拿上次的图说,同一时间只能切换到一个mode工作。

    3.CFRunLoopSourceref

    可以理解为是事件源(像点击事件)

    根据堆栈分类有两种:

    Source0:处理App内部事件,App自己负责管理

    Source1:由RunLoop和内核进行管理

    4.CFRunLoopTimerRef

    - (void)timer1 {
        //调用了scheduledTimer返回的定时器,已经自动被添加到当前runLoop中,而且是NSDefaultRunLoopMode
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
        //修改模式
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
    }
    - (void)run {
        NSLog(@"run");
    }

    如果只是调用了NSTimer,系统会自动将其添加到当前RunLoop的NSDefaultRunLoopMode中

    当然你也可以自己使用addTimer方法进行模式的修改

    与第二条CFRunLoopMode进行了结合,不过还是那句话,同一时间只能有一个模式

    5.CFRunLoopObserverRef

    Observer是观察者,能够监听RunLoop的状态改变

    - (void)observer {
        //添加observer
        CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
            NSLog(@"----监听到RunLoop状态改变-----%zd",activity);
        });
        //添加观察者,监听RunLoop的状态
        CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
        
        //释放Observer
        CFRelease(observer);
    }

    可以观察到以下这些状态

    typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
        kCFRunLoopEntry = (1UL << 0),//即将进入Loop
        kCFRunLoopBeforeTimers = (1UL << 1),//即将处理timer
        kCFRunLoopBeforeSources = (1UL << 2),//即将处理source
        kCFRunLoopBeforeWaiting = (1UL << 5),//即将进入休眠
        kCFRunLoopAfterWaiting = (1UL << 6),//从休眠中唤醒
        kCFRunLoopExit = (1UL << 7),//即将退出Loop
        kCFRunLoopAllActivities = 0x0FFFFFFFU//所有状态
    };

    总体逻辑图:

  • 相关阅读:
    2011年9月11日的最后几分钟开始学习Zend freamework
    PHP常用的调试技术 一周的时间正在整理
    二叉树最近共同祖先问题
    最近一段时间的思考
    字符编码笔记:ASCII,Unicode和UTF8
    node简介
    如何影响别人
    HTTP协议状态码详解(HTTP Status Code)
    jQuery常见的50种用法
    php上传多张图片
  • 原文地址:https://www.cnblogs.com/langji/p/RunLoop.html
Copyright © 2020-2023  润新知