美文网首页
IOS NSTimer和RunLoop问题

IOS NSTimer和RunLoop问题

作者: maskerII | 来源:发表于2019-11-20 15:49 被阅读0次

    一、 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]
    

    相关文章

      网友评论

          本文标题:IOS NSTimer和RunLoop问题

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