zoukankan      html  css  js  c++  java
  • 小结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//所有状态
    };

    总体逻辑图:

  • 相关阅读:
    python语言中的编码问题(续)
    python语言中的编码问题
    如何为eclipse安装合适版本的python插件pydev
    JavaScript 中的变量命名方法
    使用tomcat manager 管理和部署项目
    不同地图坐标系的经纬度转换方法
    tomcat项目中文乱码问题解决方法
    CATransition(os开发之画面切换) 的简单用法
    星级评价 实现
    ASIHttpRequest 使用理解
  • 原文地址:https://www.cnblogs.com/langji/p/RunLoop.html
Copyright © 2011-2022 走看看