В то время как a UIScrollView
(или его производный класс) прокручивается, кажется, что все запущенные NSTimers
становятся паузами до завершения прокрутки.
Есть ли способ обойти это? Потоки? Настройка приоритета? Что-нибудь?
В то время как a UIScrollView
(или его производный класс) прокручивается, кажется, что все запущенные NSTimers
становятся паузами до завершения прокрутки.
Есть ли способ обойти это? Потоки? Настройка приоритета? Что-нибудь?
Легко и просто реализовать решение:
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
Это быстрая версия.
timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
Вам нужно запустить другой поток и другой цикл запуска, если вы хотите, чтобы во время прокрутки запускались таймеры; поскольку таймеры обрабатываются как часть цикла событий, если вы заняты обработкой прокрутки вашего представления, вы никогда не обходите таймеры. Несмотря на то, что пренебрежение производительностью/батареей при работе таймеров на других потоках может не стоить обрабатывать этот случай.
для всех, кто использует Swift 4:
timer = Timer(timeInterval: 1, target: self, selector: #selector(timerUpdated), userInfo: nil, repeats: true)
RunLoop.main.add(timer, forMode: .common)