2012-06-28 15 views
12

Sto provando a far eseguire all'azione la mia applicazione dopo un ritardo, ma dovrà essere eseguita MENTRE l'utente sta interagendo/scorrendo su uno UIScrollView.iOS: Esegui azione dopo tempo mentre l'utente interagisce/scorre

Non sono sicuro del motivo per cui né performSelector:withObject:afterDelay o scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: verranno attivati. È perché sono su un thread in background?

Qualche suggerimento o aiuto?

+0

Ciò che non sta lavorando con performSelector: afterDelay :? Che cosa stai cercando di fare? SEI SICURO che non sparano - hai messo una dichiarazione NSLog per controllare? –

+0

Ho inserito una dichiarazione di registro. Spara dopo che l'utente interrompe l'interazione con lo schermo. Sto cercando di aggiornare un'etichetta. – RileyE

+0

Ho trovato questo: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom, ma non c'è alcun modo per incorporare un ritardo con quello. – RileyE

risposta

23

Entrambe NSTimer e performSelector:withObject:afterDelay: per impostazione predefinita attivano solo la normale modalità ciclo di funzionamento. Durante lo scorrimento, il ciclo di esecuzione è nella modalità di tracciamento degli eventi.

è necessario pianificare la vostra azione temporizzata in tutte le modalità comuni:

NSTimer *timer = [NSTimer timerWithTimeInterval:0.016 target:self selector:@selector(fire:) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

o

[self performSelector:@selector(fire:) withObject:nil afterDelay:1.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; 

C'è anche la dedicato NSEventTrackingRunLoopMode.

+0

Quindi, è proprio come quello che ho nel commento? – RileyE

+0

@RileyE Non sono sicuro di capire cosa intendi. Quale commento? –

+0

Siamo spiacenti. Sono molto vago! Il commento in cui menziono un post che stavo guardando prima. Il post è: http://stackoverflow.com/questions/2865760/performselectorwithobjectafterdelay-not-working-from-scrollviewdidzoom – RileyE

4

Assicurarsi che il trigger ritardato si verifichi su NSRunLoopCommonModes. L'impostazione predefinita è NSDefaultRunLoopMode che non riceverà i messaggi mentre ad es. scrolling.

[self performSelector:@selector(fire:) withObject:nil afterDelay:2.0 inModes:@[NSRunLoopCommonModes]]; 

In alternativa è possibile utilizzare GCD che si comporta anche allo stesso modo (non sono sicuro quale modalità runloop usa)

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    <#code to be executed on the main queue after delay#> 
}); 
0

per SWIFT:

performSelector(#selector(fire:), withObject: sender, afterDelay: 1.0, inModes: [NSRunLoopCommonModes]) 
Problemi correlati