您的位置:首页 > 产品设计 > 产品经理

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 的结合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: