UIScrollView在滚动时暂停NSTimer
我有一个UIScrollView
,它有一系列快速更新数字的标签(每隔0.06秒)。 但是,当滚动视图移动时, NSTimer
会暂停,直到滚动和弹性动画结束后才会继续。
无论滚动视图的状态如何,我如何避免这种情况并让NSTimer
运行?
解决此问题的一种简单方法是将NSTimer
添加到mainRunLoop
。
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
要从安装它的所有运行循环模式中删除计时器,请向计时器发送invalidate
消息。
对于swift:
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
( Swift )另一种选择:你可以使用像这样的基于GCD的计时器系统:
class GCDTimer { private var _timer : dispatch_source_t? init() { } private func _createTheTimer(interval : Double, queue : dispatch_queue_t, block : (() -> Void)) -> dispatch_source_t { let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); if (timer != nil) { dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, Int64(interval * Double(NSEC_PER_SEC))), UInt64(interval * Double(NSEC_PER_SEC)), (1 * NSEC_PER_SEC) / 10); dispatch_source_set_event_handler(timer, block); dispatch_resume(timer); } return timer; } func start(interval : Double, block : (() -> Void)) { let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); _timer = _createTheTimer(interval, queue: queue, block: block) } func stop() { if (_timer != nil) { dispatch_source_cancel(_timer!); _timer = nil; } } }