Martin总结:RunLoop

标题由Martin开头的文章,均由Martin_Joy总结,再次感谢Martin童鞋!

前言

因为最近一直在准备校招,阅读了很多相关的书籍及blog,因为自己没有形成清晰的知识结构,导致越看越乱。无意中和朋友Martin_Joy聊起此事,发现他梳理的知识结构非常清晰,征得Martin的同意后,决定发上来,方便学习之用。由此可见,Martin童鞋是个非常乐于分享的人。在此,表示对他深深的感谢,也希望Martin在iOS开发的道路上越走越远。

Martin总结:RunLoop_第1张图片

runloop基本概念

runloop可以看成和线程是一对一的关系,但是runloop可以进行嵌套。runloop主要用来处理各种事件,能够节省CPU资源,在需要处理的时候唤醒,空闲的时候休眠。

猜想内部实现

   function loop() {
       initialize();
       do {
           var message = get_next_message();
           process_message(message);
       } while (message != quit);
   }

唤醒和休眠

线程休眠前,指定用于唤醒我的mach_port,然后去休眠后,系统内核会将线程挂起,处于mach_msg_trap()状态,当其他线程(比如有一个进程在后面控制用户输入,一直在跑)向内核发送mach_msg的时候,内核去mach_port唤醒休眠的线程,休眠线程的trap状态被唤醒,runloop继续干活

实际运用

  • AFNetworking:担心线程提前推出,导致NSOperation 无法接受回调,于是作者单独起一个thread,内置一个runloop,回调都由它接收,不占用主线程,也不耗CPU资源。类似于常驻服务的线程。runloop一直监听port,使runloop一直等待,怕他没事干,退出
  • TableView中实现平滑滚动延迟加载图片:利用CFRunLoopMode的特性,可以将图片的加载放到NSDefaultRunLoopModemode里,这样在滚动UITrackingRunLoopMode这个mode时不会被加载而影响到。
  • 监控卡顿的方法
  • iOS 实时卡顿监控
  • 简单监测iOS卡顿的demo
  • 检测iOS的APP性能的一些方法
  • 微信iOS卡顿监控系统
  • iOS实时卡顿监控
  • runloop处理大量大图片加载问题
  • iOS Fast Scrolling with RunLoop Work Distribution
  • 在遇到崩溃的时候,自主处理例如弹出提示等
  • 让Crash的App回光返照
  • iOS 启动连续闪退保护方案
  • 漫谈 iOS Crash 收集框架

拓展阅读

  • RunLoop学习笔记,从CF层面了解由于CFRunLoopMode机制iOS程序ScrollView的滑动为何如此平滑的原因。还有介绍AFNetworking如何单独发起一个global thread内置runloop达到不占用主线程又不耗CPU资源的。
  • 深入理解RunLoop

你可能感兴趣的:(Martin总结:RunLoop)