小结RunLoop1

Posted blue-fly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小结RunLoop1相关的知识,希望对你有一定的参考价值。

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//所有状态
};

 

以上是关于小结RunLoop1的主要内容,如果未能解决你的问题,请参考以下文章

[code] PTA 胡凡算法笔记 DAY039

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板