我有一个UIScrollView
,它有一系列快速更新数字(每0.06秒)的标签。然而,当滚动视图正在移动时,NSTimer
被暂停,并且直到滚动和弹性动画完成之后才会继续。UIScrollView在滚动时暂停NSTimer
无论滚动视图的状态如何,我该如何避免这种情况并让NSTimer
运行?
我有一个UIScrollView
,它有一系列快速更新数字(每0.06秒)的标签。然而,当滚动视图正在移动时,NSTimer
被暂停,并且直到滚动和弹性动画完成之后才会继续。UIScrollView在滚动时暂停NSTimer
无论滚动视图的状态如何,我该如何避免这种情况并让NSTimer
运行?
解决此问题的简单方法是将NSTimer
添加到mainRunLoop
。
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
从在其上安装其所有运行回路模式删除计时器,发送invalidate
消息给定时器。
(斯威夫特)的替代:您可以使用基于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;
}
}
}
这里是你将如何使用它: 'VAR myInterval:GCDTimer = GCDTimer() myInterval.start(1.0){ 的println( “笑”) }' – Thyselius
如果你想使用作出更新UI元素这个定时器,你必须这样做在主线程,就像这样:'dispatch_async(dispatch_get_main_queue(){ \t \t \t \t \t \t self.myUIImageView.image =的UIImage(数据:!数据NSData的) \t \t \t \t \t})' – Thyselius
很高兴你发现它很有用! – raf
为SWIFT:
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
有了这个,我其实没有
所以要启动定时器,它在执行该行时启动,是否正确? –
从文档:“你可以添加一个定时器到多种输入模式,当在指定模式下运行时,接收器使计时器在其计划的启动日期或之后触发,当启动时,计时器调用其相关的处理程序,是指定对象上的选择器。“ –