UIScrollView приостанавливает NSTimer при прокрутке - PullRequest
7 голосов
/ 15 августа 2011

У меня есть UIScrollView с серией меток, которые быстро обновляют числа (каждые 0,06 секунды).Однако, когда представление прокрутки движется, NSTimer приостанавливается и продолжается только после завершения прокрутки и эластичной анимации.

Как можно избежать этого и запустить NSTimer независимо отсостояние просмотра прокрутки?

Ответы [ 3 ]

24 голосов
/ 15 августа 2011

Простой способ исправить это - добавить NSTimer к mainRunLoop.

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

Чтобы удалить таймер из всех режимов цикла выполнения, в котором он установлен, отправьте ему сообщение invalidate.

1 голос
/ 29 февраля 2016

для быстрого:

NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
0 голосов
/ 25 ноября 2014

( 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;
        }
    }
}
...