《新浪微博剖析 iOS 高级面试》笔记(七):RunLoop相关面试问题

《新浪微博剖析 iOS 高级面试》笔记(七):RunLoop相关面试问题

IOS小彩虹2021-07-15 6:10:0070A+A-

我的Github地址

小码哥《恋上数据结构与算法》笔记

极客时间《iOS开发高手课》笔记

iOS大厂面试高频算法题总结

iOS面试资料汇总

概念

  • Runloop是通过内部维护的事件循环来对事件/消息进行管理的一个对象。
    • 事件循环就是没有消息需要处理时,休眠以避免资源占用。
      • 用户态切换到内核态
    • 有消息需要处理时,立刻被唤醒。
      • 内核态切换到用户态

1、main函数为什么可以保证不退出?

  • UIApplicationMain启动主线程的runloop

数据结构

  • CFRunLoop
    • pthread
      • runloop线程是一一对应的
    • currentMode
      • CFRunLoopMode
    • modes
      • NSMutableSet<CFRunLoopMode *>
    • commonModes
      • NSMutableSet<NSString *>
    • commonModelItems
      • NSMutableSet<<Observer, Timer, Source>>
  • CFRunLoopMode
    • name
      • NSDefaultRunLoopMode
    • sources0
      • NSMutableSet
    • sources1
      • NSMutableSet
    • observers
      • NSMutableArray
    • timers
      • NSMutableArray
  • Source/Timer/Observer
    • Source0
      • 当添加事件到Source0,它并不会主动唤醒线程,需要手动唤醒线程。
    • Source1
      • 具备唤醒线程的能力。
    • CFRunLoopTimer
      • 基于事件的定时器,和NSTimer是可以转换的。
    • CFRunLoopObserver
      • 观测时间点
        • kCFRunLoopEntry
        • kCFRunLoopBeforeTimers
        • kCFRunLoopBeforeSources
        • kCFRunLoopBeforeWaiting(用户态切内核态)
        • kCFRunLoopAfterWaiting(内核态切用户态)
        • kCFRunLoopExit

1、各个数据结构之间的关系

  • 当在mode1下运行时,只能接收和处理mode1下的sourcesobserverstimers,是无法接收mode2mode3下的事件回调的。

2、如何将一个Timer同时加入到两个Mode中?

  • commonMode不是实际存在的一种Mode
  • 是同步Source/Timer/Observer到多个Mode中的一种技术方案。

事件循环机制

1、RunLoop事件循环机制是什么样的?

2、如何唤醒休眠的Runloop?

  • Source1
  • Timer事件
  • 外部手动唤醒

RunLoop与NSTimer

1、滑动TableView的时候定时器还会生效吗?

  • 在滑动时,currentMode会从kCFRunLoopDefaultMode切换到UITrackingRunLoopMode
  • 可以通过CFRunLoopAddTimer(runLoop,timer,commonMode)函数,将timer添加到commonMode当中。
  • commonMode的作用就是将某一个事件源同步到多个mode当中。

RunLoop与多线程

  • 线程RunLoop是一一对应的。
  • 自己创建的线程默认是没有RunLoop的。

1、怎样实现一个常驻线程?

  • 为当前线程开启一个RunLoop
  • 向该RunLoop中添加一个Port/Source等维持RunLoop的事件循环。
  • 启动该RunLoop

RunLoop面试总结

  • 什么是RunLoop,它是怎样做到有事做事,没事休息的?
  • RunLoop与线程是怎样的关系?
  • 如何实现一个常驻线程
  • 怎样保证子线程数据回来更新UI的时候不打断用户的滑动操作?
    • 子线程抛回给主线程更新UI的逻辑,包装起来,提交到主线程的kCFRunLoopDefaultMode下。
    • 当前用户滑动tableView处于UITrackingRunLoopMode模式下就不会执行该逻辑。
    • 当用户停止滑动之后,当前线程mode切换到kCFRunLoopDefaultMode下,就会处理更新UI的逻辑。

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1

联系我们