IOS NSTimer和RunLoop问题

2019-11-20  本文已影响0人  maskerII

一、 RunLoop和线程关系
1.runLoop和线程是紧密关联的,可以说是为了线程而生,没有线程,RunLoop也没有存在的必要
2.runLoop和线程是一一对应的,主线程的runLoop默认是创建的,子线程的需要手动创建。currentRunLoop懒加载的,在同一个子线程中创建多个runloop,则返回的都是同一个对象,因为其是懒加载模式的
3.在runloop中有多个运行模式,但是runloop只能选择一种模式运行,mode里面至少要有一个timer或者是source
4.在第一次获取时创建,在线程结束时销毁

          获得主线程的runLoop:NSRunLoop *mainRunLoop =[NSRunLoop mainRunLoop];
          获得当前线程runLoop:NSRunLoop *currentRunLoop =[NSRunLoop currentRunLoop];

二、 NSTimer 在 RunLoop中使用

      1.scheduled创建

     + (NSTimer *)scheduledTimerWithTimeInterval: (NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block

      通过scheduled创建,默认加入到当前RunLoop里的,指定模式为NSDefaultRunLoopMode
     如果在主线程里创建,需要修改下Mode为NSRunLoopCommonModes,不然,当滚动事件发生时,会导致NSTimer不执行,主线程的RunLoop是默认开启的,所以不需要[[NSRunLoop currentRunLoop] run]
  
     如果在子线程里创建,且当前线程里无滚动事件,则不需要修改Mode,子线程的RunLoop默认不开启的,最好加上[[NSRunLoop currentRunLoop] run]

     2.timerWithTimeInterval 创建
   
      + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block

      这种方式创建不会自动加入RunLoop,需要手动加入
      如果在主线程里创建,需要修改下Mode为NSRunLoopCommonModes,不然,当滚动事件发生时,会导致NSTimer不执行,主线程的RunLoop是默认开启的,所以不需要[[NSRunLoop currentRunLoop] run]
  
      如果在子线程里创建,且当前线程里无滚动事件,则不需要修改Mode,子线程的RunLoop默认不开启的,最好加上[[NSRunLoop currentRunLoop] run]
上一篇下一篇

猜你喜欢

热点阅读