【问题标题】:UIScrollView pauses NSTimer while scrollingUIScrollView 在滚动时暂停 NSTimer
【发布时间】:2011-10-26 22:12:54
【问题描述】:

我有一个UIScrollView,它有一系列快速更新数字的标签(每 0.06 秒)。然而,当滚动视图移动时,NSTimer 会暂停,直到滚动和弹性动画完成后才会继续。

如何避免这种情况并让NSTimer 运行而不管滚动视图的状态如何?

【问题讨论】:

    标签: ios xcode uiscrollview nstimer


    【解决方案1】:

    快速:

    NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
    

    【讨论】:

    • RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
    【解决方案2】:

    (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") }
    • 如果你想使用这个定时器来更新一个 UI 元素,你必须在主线程上这样做,像这样:dispatch_async(dispatch_get_main_queue(), { self.myUIImageView.image = UIImage(data: data as! NSData)! })
    • 很高兴你发现它有用!
    【解决方案3】:

    解决此问题的一种简单方法是将您的NSTimer 添加到mainRunLoop

    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    

    要从安装了计时器的所有运行循环模式中删除计时器,请向计时器发送invalidate 消息。

    【讨论】:

    • 因此我实际上不必触发计时器,它会在执行该行时启动,对吗?
    • 来自文档:“您可以将计时器添加到多种输入模式。在指定模式下运行时,接收器会导致计时器在其预定的触发日期或之后触发。触发后,计时器调用其关联的处理程序例程,它是指定对象上的选择器。"
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多