NSRunLoopCommonModes和Timer
2017-05-08 15:07
369 查看
当使用NSTimer的scheduledTimerWithTimeInterval方法时。事实上此时Timer会被加入到当前线程的Run Loop中,且模式是默认的NSDefaultRunLoopMode。而如果当前线程就是主线程,也就是UI线程时,某些UI事件,比如UIScrollView的拖动操作,会将Run Loop切换成NSEventTrackingRunLoopMode模式,在这个过程中,默认的NSDefaultRunLoopMode模式中注册的事件是不会被执行的。也就是说,此时使用scheduledTimerWithTimeInterval添加到Run Loop中的Timer就不会执行。
所以为了设置一个不被UI干扰的Timer,我们需要手动创建一个Timer,然后使用NSRunLoop的addTimer:forMode:方法来把Timer按照指定模式加入到Run Loop中。这里使用的模式是:NSRunLoopCommonModes,这个模式等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的结合。
- (void)viewDidLoad
{
[super viewDidLoad];
}
//timer的回调方法
- (void)timer_callback
{
NSLog(@”Timer %@”, [NSThread currentThread]);
}
所以为了设置一个不被UI干扰的Timer,我们需要手动创建一个Timer,然后使用NSRunLoop的addTimer:forMode:方法来把Timer按照指定模式加入到Run Loop中。这里使用的模式是:NSRunLoopCommonModes,这个模式等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的结合。
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"主线程 %@", [NSThread currentThread]); //创建Timer NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timer_callback) userInfo:nil repeats:YES]; //使用NSRunLoopCommonModes模式,把timer加入到当前Run Loop中。 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}
//timer的回调方法
- (void)timer_callback
{
NSLog(@”Timer %@”, [NSThread currentThread]);
}
相关文章推荐
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- iOS学习笔记----NSTimer(基本使用,DefaultRunLoopMode,NSRunLoopCommonModes,准确性)
- NSRunLoopCommonModes和NSDefaultRunLoopMode区别时发现
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 在寻找NSRunLoopCommonModes和NSDefaultRunLoopMode区别时发现
- invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_Run
- invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_Run
- invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_Run
- invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_Run
- NSTimer 与 NSRunLoop Modes
- Common Lisp Loop 宏实例
- IOS NSRunLoop
- NSTimer与Run loop Modes
- NSTimer与Run loop Modes
- What is the basic difference between NSTimer, NSTask, NSThread and NSRunloop?
- NSRunLoop Internals
- NSTimer 与 Run loop Modes