NSTimer-计时器 -02修改NSTimer在NSRunLoop上的模式

NSTimer-计时器-01基础

  • 为什么要修改NSTimer在NSRunLoop上的模式?
    因为在拖拽TextView控件时,拥有TimerUIScrollView,它不运行了.


    原因: 默认线程的方式是NSDefaultRunLoopMode也就是说同一时间只能执行一个任务. 那么怎么实现TextVie控件滚动时,不影响(NSTimer)定时滚动的 UIScrollView呢?

    • 将定时器,以NSRunLoopCommonModes模式添加到RunLoop中,就可以实现TextVie控件在滚动时,UIScrollView也在定时滚动.
  • 怎么修改?

    "主线程运行循环对象"
    @property(class, readonly, strong) NSRunLoop *mainRunLoop;
    
    "将定时器,以指定模式添加到runLoop中"
    - (void)addTimer:(NSTimer *)timer 
           forMode:(NSRunLoopMode)mode;
    
  • 举例-1

    NSDefaultRunLoopMode(默认) : 同一时间只能执行一个任务
    NSRunLoopCommonModes(公用) : 可以分配一定的时间处理其他任务
    "将定时器添加到runLoop中,以NSRunLoopCommonModes添加"
    "目的:"不管主线程在做什么操作,都要分配一定的时间处理定时器
    
    -- 创建一个定时器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextPage:) userInfo:nil repeats:YES];
    -- 将定时器以"NSRunLoopCommonModes"模式,添加到线程中去.
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
    

延伸一些概念:

  • 线程: 用来执行任务的(同一时间只能执行一个任务)
  • 主线程: 程序一启动就会默认创建一条线程,这个线程称为主线程
  • 主线程的作用: 显示刷新UI界面,处理与用户的交互事件
  • 多线程的原理: 假设: 1秒 -> 1万个0.0001秒,cpu在多个任务之间来回的快速切换,造成同时执行的假象

你可能感兴趣的:(NSTimer-计时器 -02修改NSTimer在NSRunLoop上的模式)