UIScrollView mette in pausa NSTimer fino al termine dello scorrimento
-
03-07-2019 - |
Domanda
Mentre un UIScrollView
(o una sua classe derivata) sta scorrendo, sembra che tutti i NSTimer
in esecuzione vengano messi in pausa fino al termine dello scorrimento.
C'è un modo per aggirare questo? Le discussioni? Un'impostazione di priorità? Tutto ciò?
Soluzione
Un facile & amp; soluzione semplice da implementare è fare:
NSTimer *timer = [NSTimer timerWithTimeInterval:...
target:...
selector:....
userInfo:...
repeats:...];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
Altri suggerimenti
Per chiunque usi Swift 3
timer = Timer.scheduledTimer(timeInterval: 0.1,
target: self,
selector: aSelector,
userInfo: nil,
repeats: true)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
Sì, Paul ha ragione, si tratta di un problema del ciclo di esecuzione. In particolare, è necessario utilizzare il metodo NSRunLoop:
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
Questa è la versione rapida.
timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
È necessario eseguire un altro thread e un altro ciclo di esecuzione se si desidera che i timer si attivino durante lo scorrimento; poiché i timer vengono elaborati come parte del ciclo degli eventi, se sei impegnato nell'elaborazione dello scorrimento della vista, non ti avvicini mai ai timer. Anche se la pena di perf / batteria per l'esecuzione di timer su altri thread potrebbe non valere la pena gestire questo caso.
per chiunque usi Swift 4:
timer = Timer(timeInterval: 1, target: self, selector: #selector(timerUpdated), userInfo: nil, repeats: true)
RunLoop.main.add(timer, forMode: .common)