RunLoop

<span style="font-size:14px;">
</span><pre name="code" class="objc"><span style="font-size:14px;">   
 一 概念
    1 运行循环,事件驱动 UIApplicationMain()会启动一个RunLoop;
    2 BOOL runing = YES;
    do {} while (runing);
    3 iOS中有两套API
    {
        NSRunLoop (Foundation) OC语法
        CFRunLoopRef (CoreFoundation) C语法
    }
    4 RunLoop与线程
    {
        每条线程都有唯一的一个与之对应的RunLoop对象
        主线程的RunLoop自动创建,子线程需要主动创建
        线程结束时销毁
    }
    5 访问RunLoop
       [NSRunloop currentRunLoop]; // 懒加载, 放在字典中,先看主线程RunLoop 存不存在,优先创建主线程RunLoop
       [NSRunloop mainRunLoop];
       CFRunLoopGetCurrent();
       CFRunLoopGetMain();
    二 作用
    1 保持程序的持续运行
    2 处理App中的各种事件(触摸事件,定时器事件,selector)
    3 节省CPU资源,提高程序性能,该做事做事,该休息休息
    4 自动释放池在睡眠之前释放,唤醒前创建
    三 相关类
    <img src="https://img-blog.csdn.net/20160414180919944?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="241" width="270" alt="" />
    CFRunLoopRef
    {
     包含若干个Mode,每个Mode又包含若干个Source/Source/Timer/Observer
     每次RunLoop启动时,只能制定一个Mode,这个Mode被称作CurrentMode
     如果切换Mode,只能退出Loop,再重新制定一个Mode进入
    }
    CFRunLoopModelRef (运行模式)
     {
     kCFRunLoopDefaultMode : 系统默认,通常是主线程在这个Mode下运行
     UITrackingRunLoopMode : 界面跟踪,用于Scrolliew追踪触摸滑动,保证界面滑动时不受其他Mode影响
     kCFRunLoopCommonModes : 占位用的Mode,不是一种真正的Mode,标记为这个Mode, Default, Tracking
     UIInnitalizationRunLoopMode : 在刚启动App时进入的第一个Mode,启动完成后不再使用
     GSEventReceiveRunLoopMode : 接受系统事件(渲染,绘图)内部Mode,通常用不到
     }
    
    CFRunLoopTimerRef 基于时间的触发器,NSTimer kCFRunLoopCommonModes
    CFRunLoopSourcesRef : 事件源
    {
    1 按照官方文档分
    Ports-Bsaed Sources
    Custom Input Sources
    Cocoa Rerform Selector Sources
    2 按照函数调用栈
    Source0: 非基于Port
    Source1: 基于Port的,通过内核和其他线程通信,接收,分发系统事件
    }
    CFRunLoopObserverRef
    {
     1 监听状态
     typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
     kCFRunLoopEntry = (1UL << 0),// 1
     kCFRunLoopBeforeTimers = (1UL << 1), // 2
     kCFRunLoopBeforeSources = (1UL << 2), // 4
     kCFRunLoopBeforeWaiting = (1UL << 5), // 32
     kCFRunLoopAfterWaiting = (1UL << 6), // 64
     kCFRunLoopExit = (1UL << 7), // 128
     kCFRunLoopAllActivities = 0x0FFFFFFFU
     };
    
    }
    1 CFRunLoopModelRef (运行模式)
    {
     
    }
    四 应用
    NSTimer
    五 整体处理逻辑
<img src="https://img-blog.csdn.net/20160414180945451?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="389" width="401" alt="" />
    六 实践
    {
     创建一条常驻的线程
     添加 观察者 
     控制定时器在特定模式下
     自定义源
    }
    // 1 添加观察着
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        NSLog(@"监听RunLoop状态发生改变--%zd", activity);
    });
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
    CFRelease(observer);</span>

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值