美文网首页
iOS开发·RunLoop是什么?CFRunLoopSource

iOS开发·RunLoop是什么?CFRunLoopSource

作者: 富城 | 来源:发表于2020-12-03 20:51 被阅读0次

1、runloop是线程相关的基础框架的一部分。
2、是一个对象,这个对象提供一个入口函数。
3、一个runloop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件
4、其实内部就是do-while循环,这个循环内部不断地处理各种任务(比如SourceTimerObserver)。
5、使用runloop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。

重点
1、保持程序的持续运行
2、处理app的各种事件
3、节省CPU资源,提高程序性能

  • 线程runloop一一对应的,内部存储是字典,线程是key,runloop是value
  • 线程创建的时候,并没有创建runloop 对象,runloop会在第一次获取的时候自动创建
  • 主线程默认开启了runloop,子线程默认没有开启runloop。
  • 一个runloop只能在一种模式mode下运行,如果想更换模式,就得从这个runloop退出来。
  • runloop 在某个模式下运行,意味着只能在处理这个模式下的source、observe、timer。
// 单独这句代码是不能启动runloop的,需要添加事件(如NSPort、source0、source1、timer)使用observe无效的。
[[NSRunLoop currentRunLoop] run];

CFRunLoopSourceRef:就是事件源()输入源
按照官方文档的分类:
1、Port-Based Sources
2、Custom Input Sources
3、Cocoa Perform Selector Sources

按照函数调用栈Sources的分类:
1、Source0非基于Port的(按钮的点击事件,函数栈可以看)
2、Source1基于Port,通过内核和其他线程通信接收分发系统事件
source1接收到的事件最终是要交给source0的.


CFRunLoopObserver:是观察者

/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0), // 即将进入runloop    1
    kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理timer    2
    kCFRunLoopBeforeSources = (1UL << 2), // 即将处理sources   4
    kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠   32
    kCFRunLoopAfterWaiting = (1UL << 6), // 刚从休眠中唤醒   64
    kCFRunLoopExit = (1UL << 7), // 即将退出loop   128
    kCFRunLoopAllActivities = 0x0FFFFFFFU // 所有状态
};
// 监听当前runloop的所有状态
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
    NSLog(@"%lu",activity);
});
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
 // 监听完事之后需要释放CoreFoundation框架的对象
CFRelease(observer);
runloop处理逻辑.png

CFRunLoopTimerRef:是基于时间的触发器
CFRunLoopTimerRef基本上说的就是NSTimer,它受runloopmode的影响
GCD的定时器是不受runloop的mode影响

GCD的定时器是什么?

// 这个timer变量需要强引用,不然不会起作用
@property (nonatomic, strong) dispatch_source_t timer;

self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.timer, ^{
    NSLog(@"----%@", [NSThread currentThread]);
});
dispatch_resume(self.timer);
    
 //取消定时器
dispatch_cancel(self.timer);
self.timer = nil;

相关文章

  • iOS开发·RunLoop是什么?CFRunLoopSource

    1、runloop是线程相关的基础框架的一部分。2、是一个对象,这个对象提供一个入口函数。3、一个runloop就...

  • iOS开发 Runloop机制

    iOS开发 Runloop机制

  • 谈谈 iOS RunLoop 底层

    RunLoop是什么? RunLoop是iOS/Mac OS开发中比较重要的知识点,它贯穿程序运行的整个过程。它是...

  • 谈谈RunLoop底层

    RunLoop是什么? RunLoop是iOS/Mac OS开发中比较重要的知识点,它贯穿程序运行的整个过程。它是...

  • GeekBand - iOS 多线程和RunLoop 总结

    iOS 开发高级进阶 第三周 多线程 Runloop iOS 多线程以及 RunLoop 学习总结 基础知识 什么...

  • RunLoop

    详情见: iOS中的RunLoop 1、什么是RunLoop?2、开发中如何使用RunLoop?什么应用场景?3、...

  • runloop 介绍

    iOS面试题之runloop 阅读目录 1.runloop是什么/runloop的概念? 2.NSRunLoop ...

  • RunLoop

    RunLoop是iOS开发中非常重要的一个知识点。也是面试必考知识点。本文主要记录一下内容1 RunLoop是什么...

  • iOS RunLoop(1)RunLoop简介

    iOS RunLoop(1)RunLoop简介iOS RunLoop(2)RunLoop相关类iOS RunLo...

  • iOS RunLoop(2)RunLoop相关类

    iOS RunLoop(1)RunLoop简介iOS RunLoop(2)RunLoop相关类iOS RunLo...

网友评论

      本文标题:iOS开发·RunLoop是什么?CFRunLoopSource

      本文链接:https://www.haomeiwen.com/subject/nujuwktx.html