美文网首页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框架整理

    Runloop runloop 是什么 runloop 是一个运行循环,实际上是一个对象,这个对象提供了一个入口函...

  • runloop-整理中

    runloop-整理中

  • RunLoop的各种运行模式

    RunLoop运行模式相关 Core Foundation框架中关于RunLoop的5个类 CFRunLoopRe...

  • runloop 面试题

    runloop 面试题 基于最近的几次面试,整理了runloop 的相关知识 1、Runloop 是什么?Run ...

  • iOS界面卡顿监测

    RunLoop RunLoop是与线程相关的概念。 在Cocoa和Core Foundation框架中提供了run...

  • 逃不出的圈子 -- RunLoop

    本文大量参考YY大神的深入理解RunLoop,整理了一下思路,化繁为简,仅作为学习资料整理。 RunLoop,顾名...

  • 3.RunLoop

    什么是 runloop ?runloop 是线程相关的基础框架的一部分。一个 runloop 就是一个事件处理的循...

  • iOS关于RunLoop 的总结

    Runloop Runloop是事件接收和分发机制的一个实现。是线程相关的基础框架的一部分。一个Runloop就是...

  • iOS RunLoop 总结以及相关面试题解答

    Runloop Runloop是事件接收和分发机制的一个实现。是线程相关的基础框架的一部分。一个Runloop就是...

  • iOS RunLoop 总结以及相关面试题解答

    Runloop Runloop是事件接收和分发机制的一个实现。是线程相关的基础框架的一部分。一个Runloop就是...

网友评论

    本文标题:Runloop框架整理

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