美文网首页iOS专题
Runloop框架整理

Runloop框架整理

作者: 没有格子衫 | 来源:发表于2019-11-28 11:17 被阅读0次

    Runloop

    runloop 是什么

    runloop 是一个运行循环,实际上是一个对象,这个对象提供了一个入口函数。程序会进入do...while循环,循环处理一些事情。


    runloop的作用

    • 1,保持程序的持续运行

    • 2,处理app中的各种事件(触摸,定时器,performSelector)

    • 3,节省cpu资源,提供程序的性能。该做事就做事,该休息就休息。

    runloop应用

    • 1, block应用

      __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__

    • 2, 调用timer

      __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__

    • 3, 响应source0

      __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNTION__

    • 4, 响应source1

      __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_DUNTION__

    • 5, GCD主队列

      __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__

    • 6, observer源

      __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNTION__

    runloop与线程的关系

    • 一一对应关系

      通过一个全局可变CFMutableDicionaryRef

    • runloop 的创建

      __CFRunLoopCreate(pthread_main_thread_np())

    • runloop 存储

      CFDictionarySetValue(dict,pthreadPointer(pthread_main_thread_np()),mainLoop);

    • runloop 获取

      CFDictionaryGetValue(__CFRunloops,pthreadPointer(t))

    CFRunloop源码解析

    • CFRunLoopRef

      • 对象结构体

      • 利用线程创建

      • 默认common为nil

      • 默认mode为kCFRunLoopDefaultMode

      • _CFRuntimeCreateInstance

      • __CFRunLoopPushPerRunData

      • __CFRunLoopLockInit

      • __CFRunLoopSetIgnoreWakeUps

      • loop赋值初始化

      • 一个runloop可以包含多种mode

    • CFRunLoopModeRef

      • mode

        • kCFRunLoopDefaultMode

        • UIInitilizationRunLoopMode

        • GSEventReceiveRunLoopMode

        • KCFRunLoopCommonModes

      • 一个mode包含多个Items

        • CFRunLoopAddTimer

        • CFRunLoopAddObserver

        • CFRunLoopAddSource

        • CFSetAddValue(rl->_commonModelItems, rlt); 存储Item到对应的mode里面

        • __CFRunLoopDoBlocks(rl, rlm)调用我们之前存储的Item

          • doit = CFEqual

          • doit = CFSetContainsValue

          • __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__(block)

          • block();

    • CFRunLoopSourceRef

      • source0
        处理App内部事件,App自己负责管理(触发):UIEvent CFSocket

        • 调用底层

          • 1,因为source0 只包含一个回调(函数指针)它并不能主动触发事件,

          • 2,CFRunLoopSourceSignal(source)将这个事件标记为待处理,

          • 3,CFRunLoopWeakUp来唤醒runloop,让他处理事件

        • CFRunLoopSourceContext

        • 创建一个底层source0 源 CFRunLoopSourceRef source0 = CFRunLoopSourceCreate(CFAllocatorGetDefault(), 0, &context);

        • 把我们创建的source0添加到runloo CFRunLoopAddSource(rlp, source0, KCFRunLoopDefaultMode)

        • 执行信号,标记待处理CFRunLoopSourceSignal

        • 唤醒runloop去处理CFRunLoopWakeUp

        • 取消移除源CFRunLoopRemoveSource

        • CFRelease(rlp)

      • source1

        • 包含一个mach_port和一个回调(函数指针)

        • 被用于通过内核和其他线程相互发送消息

    • CFRunLoopTimerRef

      • timer的底层就是一个CFRunLoopTimerRef 这个timer是受我们的runloop模式切换的影响的

      • CFRunLoopTimerContext context

      • 创建timer CFRunLoopTimerRef timerRef = CFRunLoopTimerCreate(kCFAllocatorDefault, 0, 1, 0, 0, lgRunLoopTimerCallBack, &context);

      • 把我们创建的CFRunLoopAddTImer 添加到runloop

    • CFRunLoopObserverRef

      • 观察者,能够监听RunLoop的状态改变

      • CFRunLoopObserverContext

      • 创建这个观察者:CFRunLoopObserverRef observerRef = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, lgRunLoopObserverCallBack, &context);

      • 把我们的观察者添加到runloop中

      • lgRunLoopObserverCallBack 来监听状态变化



    课堂笔记

    runtime&runloop

    runloop

    • 对象

      • 入口函数

      • 程序进入do...while

    • 消息机制处理模式

    • 运行 - 计算 - 完成 - 结束任务 return 0

    线程和runloop

    • key - value 一一对应

    timer和runloop

    • timer 一定要加入到相应runloop的mode timer加到items

    • runloopRun doblock while 1, item -> next 2,doit 3, block调用

    observer

    监听runloop状态

    source

    • source0

      • 回调函数指针

        • signal 待处理

        • wakeUp唤醒runloop处理事

      • 处理app内部事件

      • app自己负责管理的事务 UIEvent CFSocket

    • source1

      • mach_port & 回调函数指针

      • port

      • 线程之间通讯

    相关文章

      网友评论

        本文标题:Runloop框架整理

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