-
为什么要修改NSTimer在NSRunLoop上的模式?
因为在拖拽TextView控件
时,拥有Timer
的UIScrollView
,它不运行了.
原因: 默认线程的方式是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在多个任务之间来回的快速切换,造成同时执行的假象