NSRunLoopCommonModes和NSDefaultRunLoopMode区别时发现
2017-08-23 09:46
621 查看
#pragma mark - add Timer
- (void)addTimer{
__weak ViewController *weakSelf = self;
NSTimer *timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
weakSelf.scrollView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
}];
// 分别注释拖拽tableView,观看效果
[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
// [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes]; //这个模式等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的结合
}
当实例化NSTimer对象的时候,通常会使用 scheduledTimerWithTimeInterval 方法。该方法会自动为我们实例化的timer添加到当前线程的RunLoop中,并且默认模式是 NSDefaultRunLoopMode。但当前线程是主线程时,某些UI事件,比如ScrollView正在拖动,将会RunLoop切换成 NSEventTrackingRunLoopMode 模式,在这个模式下,默认的 NSDefaultRunLoopMode 模式中注册的事件是不会执行的。也就是说,使用 scheduledTimerWithTimeInterval
方法添加到RunLoop中的Timer就不会执行。
为了设置一个不被UI干扰的Timer,我们需要手动创建一个Timer,然后使用RunLoop的 addTimer:forMode: 方法来把Timer按照指定的模式加入到RunLoop中。这里使用 NSRunLoopCommonModes 模式,这个模式相当于 NSDefaultRunLoopMode 和 NSEventTrackingRunLoopMode 的结合。
- (void)addTimer{
__weak ViewController *weakSelf = self;
NSTimer *timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
weakSelf.scrollView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
}];
// 分别注释拖拽tableView,观看效果
[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
// [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes]; //这个模式等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的结合
}
当实例化NSTimer对象的时候,通常会使用 scheduledTimerWithTimeInterval 方法。该方法会自动为我们实例化的timer添加到当前线程的RunLoop中,并且默认模式是 NSDefaultRunLoopMode。但当前线程是主线程时,某些UI事件,比如ScrollView正在拖动,将会RunLoop切换成 NSEventTrackingRunLoopMode 模式,在这个模式下,默认的 NSDefaultRunLoopMode 模式中注册的事件是不会执行的。也就是说,使用 scheduledTimerWithTimeInterval
方法添加到RunLoop中的Timer就不会执行。
为了设置一个不被UI干扰的Timer,我们需要手动创建一个Timer,然后使用RunLoop的 addTimer:forMode: 方法来把Timer按照指定的模式加入到RunLoop中。这里使用 NSRunLoopCommonModes 模式,这个模式相当于 NSDefaultRunLoopMode 和 NSEventTrackingRunLoopMode 的结合。
相关文章推荐
- 在寻找NSRunLoopCommonModes和NSDefaultRunLoopMode区别时发现
- iOS学习笔记----NSTimer(基本使用,DefaultRunLoopMode,NSRunLoopCommonModes,准确性)
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- NSRunLoopCommonModes和Timer
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
- 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
- xcode报错:invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific
- NSDefaultRunLoopMode
- IOS下的 NSTimer与Run loop Modes的使用和区别
- invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific
- iOS-Bug: NSRunloop Mode
- NSTimer 与 NSRunLoop Modes
- iOS多线程之理解RunLoop的CommonModes
- WPF中App.xaml中ShutdownMode值设置的区别