iOS Runloop

作者: 小和大大 | 来源:发表于2021-05-17 10:23 被阅读0次

一、什么是runloop?

runloop是通过内部维护的事件循环来对事件/消息进行管理的对象。

  • 没有事件处理时休眠,有消息需要处里时则呗唤醒

    image

二、source0和source1

  • source0非基于端口的,需手动唤醒线程
  • source1基于端口的,具备唤醒线程的能力的

简单举个例子:一个APP在前台静止着,此时,用户用手指点击了一下APP界面,那么过程就是下面这样的:
我们触摸屏幕,先摸到硬件(屏幕),屏幕表面的事件会被IOKit先包装成Event,通过mach_Port传给正在活跃的APP , Event先告诉source1(mach_port),source1唤醒RunLoop, 然后将事件Event分发给source0,然后由source0来处理。
https://blog.csdn.net/u014600626/article/details/105146577/

三、runloop运行过程

image

四、实际使用

  • UITableview滑动时,延时加载大图片,保证列表滚动的流畅性
  • 开启一个常驻线程(1.开启线程 2.添加一个基于端口的souce1事件 3.当前runloop跑起来)

五、线程与runloop

  • 线程和runloop是一一对应的
  • 自己创建的线程是没有开启runloop的

六、怎样保证子线程数据回来更新UI的时候不打断用户滑动操作?

在滑动的时候处于TrackingMode,更新主线程数据刷新设置在defaultMode下

七、autoreleasepool与runloop关系

  • 第一个 Observer 监视的事件是 Entry(即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。其 order 是-2147483647,优先级最高,保证创建释放池发生在其他所有回调之前。第二个 Observer 监视了两个事件: BeforeWaiting(准备进入休眠) 时调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;Exit(即将退出Loop) 时调用 _objc_autoreleasePoolPop() 来释放自动释放池。这个 Observer 的 order 是 2147483647,优先级最低,保证其释放池子发生在其他所有回调之后。

  • 顺序就是Entry-->push ---> BeforeWaiting--->pop-->push -->Exit-->pop,按照这样的顺便,保证了,没一次push都对应一个pop。

作者链接:https://www.jianshu.com/p/f9c89ad36f2a

相关文章

网友评论

    本文标题:iOS Runloop

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