UIScrollView приостанавливает NSTimer до завершения прокрутки - PullRequest
82 голосов
/ 03 марта 2009

Пока прокручивается UIScrollView (или его производный класс), кажется, что все запущенные NSTimers останавливаются до завершения прокрутки.

Есть ли способ обойти это? Потоки? Установка приоритета? Что-нибудь? * * 1005

Ответы [ 6 ]

196 голосов
/ 30 апреля 2010

Простое и простое в реализации решение состоит в следующем:

NSTimer *timer = [NSTimer timerWithTimeInterval:... 
                                         target:...
                                       selector:....
                                       userInfo:...
                                        repeats:...];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
23 голосов
/ 18 октября 2016

Для тех, кто использует Swift 3

timer = Timer.scheduledTimer(timeInterval: 0.1,
                            target: self,
                            selector: aSelector,
                            userInfo: nil,
                            repeats: true)


RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
8 голосов
/ 03 марта 2009

Да, Пол прав, это проблема цикла выполнения. В частности, вам нужно использовать метод NSRunLoop:

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
7 голосов
/ 05 января 2016

Это быстрая версия.

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
            NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
5 голосов
/ 03 марта 2009

Вы должны запустить другой поток и другой цикл выполнения, если вы хотите, чтобы таймеры срабатывали при прокрутке; Так как таймеры обрабатываются как часть цикла событий, если вы заняты обработкой прокрутки вашего представления, вы никогда не сможете найти таймеры. Хотя в этом случае может не оправдываться штраф в отношении производительности / заряда батареи при использовании таймеров в других потоках.

2 голосов
/ 27 февраля 2019

для всех, кто использует Swift 4:

    timer = Timer(timeInterval: 1, target: self, selector: #selector(timerUpdated), userInfo: nil, repeats: true)
    RunLoop.main.add(timer, forMode: .common)
...