【发布时间】:2011-10-26 22:12:54
【问题描述】:
我有一个UIScrollView,它有一系列快速更新数字的标签(每 0.06 秒)。然而,当滚动视图移动时,NSTimer 会暂停,直到滚动和弹性动画完成后才会继续。
如何避免这种情况并让NSTimer 运行而不管滚动视图的状态如何?
【问题讨论】:
标签: ios xcode uiscrollview nstimer
我有一个UIScrollView,它有一系列快速更新数字的标签(每 0.06 秒)。然而,当滚动视图移动时,NSTimer 会暂停,直到滚动和弹性动画完成后才会继续。
如何避免这种情况并让NSTimer 运行而不管滚动视图的状态如何?
【问题讨论】:
标签: ios xcode uiscrollview nstimer
快速:
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
【讨论】:
RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
(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;
}
}
}
【讨论】:
var myInterval:GCDTimer = GCDTimer() myInterval.start(1.0) { println("lol") }
dispatch_async(dispatch_get_main_queue(), { self.myUIImageView.image = UIImage(data: data as! NSData)! })
解决此问题的一种简单方法是将您的NSTimer 添加到mainRunLoop。
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
要从安装了计时器的所有运行循环模式中删除计时器,请向计时器发送invalidate 消息。
【讨论】: