CFRunLoop

CFRunLoop 数据结构

屏幕快照 2018-11-27 下午6.32.48.png
屏幕快照 2018-11-27 下午6.33.18.png
CFRunLoopMode数据结构
屏幕快照 2018-11-27 下午6.35.28.png

name: NSDefaultRunLoopMode(对应mode名称)
集合结构:
source0: 手动唤醒线程
source1: 具备唤醒线程的能力
数组结构:
CFRunLoopTimer : 基于事件的定时器
CFRunTimeObservers: 观测时间点等


观测时间点

观测时间点
各个数据结构之前的关系
一对多关系
RunLoop的Mode
RunLoop的Mode 多种model

如何把一个timer添加到多个mode上 ???

NSRunLoopCommonModes的用途

事件循环的实现机制

事件循环的实现机制

RunLoop的核心

核心态到用户态的切换

RunLoop与 NSTimer相关面试问题

如何把NSTimer同步添加到多个Mode上的??


把NSTimer同步添加到多个Mode源码实现
添加commonMode

RunLoop和多线程相关问题

static NSThread *thread = nil;
// 标记是否要继续事件循环
static BOOL runAlways = YES;

+ (NSThread *)threadForDispatch{
    if (thread == nil) {
        @synchronized(self) {
            if (thread == nil) {
                // 线程的创建
                thread = [[NSThread alloc] initWithTarget:self selector:@selector(runRequest) object:nil];
                [thread setName:@"com.imooc.thread"];
                //启动
                [thread start];
            }
        }
    }
    return thread;
}
+ (void)runRequest
{
    // 创建一个Source
    CFRunLoopSourceContext context = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
    CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
    
    // 创建RunLoop,同时向RunLoop的DefaultMode下面添加Source
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    
    // 如果可以运行
    while (runAlways) {
        @autoreleasepool {
            // 令当前RunLoop运行在DefaultMode下面
            CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, true);
        }
    }
    
    // 某一时机 静态变量runAlways = NO时 可以保证跳出RunLoop,线程退出
    CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    CFRelease(source);
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 Runloop机制原理 深入理解RunLoop http://www.cocoachina.com/ios/2...
    Kevin_Junbaozi阅读 9,546评论 4 30
  • 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时也是很多常见技术的幕后功臣。尽管在平时多...
    阳明AI阅读 4,743评论 0 17
  • RunLoop 的概念 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线...
    Mirsiter_魏阅读 3,775评论 0 2
  • 转载:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling阅读 5,312评论 0 13
  • 2018-04·-21 姓名 :李宏清(单位)扬州市方圆建筑工程有限公司 哈尔滨363期反省二组 【日精进打卡第 ...
    李宏清阅读 1,054评论 0 0

友情链接更多精彩内容