RunLoop

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RunLoop相关的知识,希望对你有一定的参考价值。

1、概念:RunLoop实现程序可以循环的接收时事件的不停获取,这是一种典型的事件循环模式(Event Loop)。

  例:

    技术分享

2、RunLoop循环模式:

  开启循环

  睡眠状态,等待唤醒,传入事件

  事件传入,唤醒,获取事件

  处理事件

  下次循环  

3、线程和RunLoop紧密相连,不可分割。每个线程最底层有且仅有一个RunLoop与之对应,main线程的RunLoop是开启状态,而子线程的RunLoop默认关闭状态,需要手动打开。Cocoa和CoreFundation提供RunLoop的对象,不需要自己创建。

4、RunLoop的作用:

  使程序始终处于运行状态

  节省CPU时间

  调用解耦和

  确定程序再合适时刻调用合适事件

5、RunLoop的使用

  (1)、获取RunLoop

  NSFundation框架层

  + (NSRunLoop *) currentRunLoop://获取当前线程RunLoop

  + (NSRunLoop *)mainRunLoop://获取main线程RunLoop

  CoreFundation层

  CFRunLoopGetCurrent();//获取当前线程RunLoop

  CFRunLoopGetMain();//获取main线程RunLoop

  (2)、RunLoop的启动

  - (void) run;//不建议使用(因为无法停止)

  - (void) runUntilDate:(NSDate *)limitDate;//设置限制时间

  - (void) runMode (NSString *)mode  beforeDate(NSDate *)limitDate;//设置模式和限制时间

  (3)、设置RunLoop模式

  run主要有两种模式,分别是:

  NSString * const NSDefaultRunLoopMode;//默认,空闲状态,没有指定模式,则程序运行在这种状态下  

  NSString * const NSTrackingRunLoopModes;//追踪运动模式,例:动画,拖动等

  

  NSString * const NSRunLoopCommonModes;//模式集合,默认包含上两种模式(重新确定模式的优先级)  

 

  私有mode  UIInitializationRunLoopMode  ,    GSEventReceiveRunLoopMode 

 

  RunLoop在同一时间段内只能有且仅有一种mode(即:currentMode())若想切换模式,只能性质当前RunLoop,切换后,再重新启动RunLoop

  (4)、RunLoop的停止

  CFRunLoopStop(CFRunLoopGetCurrent());//停止当前RunLoop

  [thread cancel];//停止当前线程(不推荐使用,因为当前线程可能被重新唤起,从而导致RunLoop不被停止)

6、RunLoop的相关类

    技术分享

  

  a、CFRunLoopModeRef 是RunLoop的模式,制定事件在运行过程中的优先级

 

  b、CFRunLoopSourceRef 是RunLoop输入源的抽象类(即,不能产生有实际作用的对象的类),source可以分为两类

      Source0  和  Source1:

      Source0:处理APP本身内的事件

      Source1:用于内核和其他线程发送消息,有内核和RunLoop管理,有march port驱动

  c、CFRunLoopTimer 

     RunLoop的时间源。

    定时器的三种方法:NSTimer//定时器

             CADisPlayLink (每秒钟执行60帧)

·            performSelecteor: afterDelay;//延迟执行

  d、CFRunLoopObserverRef (RunLoop观察者)

    可以观察的时间点有:

    技术分享

 

7、RunLoop的工作原理

  制定march port(唤醒端口)

  march_msg监听,该线程挂起停留在march_port_trap状态

  其他线程向内和发送该端口的msg,唤醒,RunLoop继续执行

  技术分享

 

 

8、事件处理

  事件源:Port Source(基于端口输入源)

      Custom Source(自定义)

      performSelector:方法

      Timer Source(定时源)

  加入定时源或者输入源,否则不会让线程循环长驻,没有加入则会长期占用CPU,导致不合理分配CPU资源,若在没有while循环,则线程直接完成,被销毁

9、RunLoop的执行顺序

        技术分享

 

 

 

 

  

 

 

 

 

 

 

  

 

以上是关于RunLoop的主要内容,如果未能解决你的问题,请参考以下文章

RunLoop的学习总结

RunLoop的学习总结

iOS NSRunloop

iOS RunLoop了解和使用