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

StackOverflow https://stackoverflow.com/questions/605027

  •  03-07-2019
  •  | 
  •  

Вопрос

В то время как 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

Это версия swift.

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top