当实例化NSTimer对象的时候,通常会使用 scheduledTimerWithTimeInterval 方法。该方法会自动为我们实例化的timer添加到当前线程的RunLoop中,并且默认模式是 NSDefaultRunLoopMode。但当前线程是主线程时,某些UI事件,比如ScrollView正在拖动,将会RunLoop切换成 NSEventTrackingRunLoopMode 模式,在这个模式下,默认的 NSDefaultRunLoopMode 模式中注册的事件是不会执行的。也就是说,使用 scheduledTimerWithTimeInterval 方法添加到RunLoop中的Timer就不会执行。
为了设置一个不被UI干扰的Timer,我们需要手动创建一个Timer,然后使用RunLoop的 addTimer:forMode: 方法来把Timer按照指定的模式加入到RunLoop中。这里使用 NSRunLoopCommonModes 模式,这个模式相当于 NSDefaultRunLoopMode 和 NSEventTrackingRunLoopMode 的结合。
本文讲解了NSTimer在不同RunLoop模式下的行为差异。当使用scheduledTimerWithTimeInterval方法时,如果遇到特定UI事件如ScrollView拖动,则会导致Timer暂停执行。为了避免这个问题,文章介绍了如何通过手动创建Timer并使用addTimer:forMode:方法将其加入到NSRunLoopCommonModes模式中,确保Timer不受UI事件的影响。
8

被折叠的 条评论
为什么被折叠?



