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


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

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

5 78

5 ответов:

легко и просто реализовать решение, чтобы сделать:

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

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

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


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

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

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

это версия swift.

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

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