UIScrollView приостанавливает NSTimer до тех пор, пока прокрутка не завершится

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

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

Ответ 1

Легко и просто реализовать решение:

NSTimer *timer = [NSTimer timerWithTimeInterval:... 
                                         target:...
                                       selector:....
                                       userInfo:...
                                        repeats:...];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

Ответ 2

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

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


RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

Ответ 3

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

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode

Ответ 4

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

timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
            NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)

Ответ 5

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

Ответ 6

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

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