2012-06-28 10 views
12

Ich versuche, meine Anwendung zu einer Aktion nach einer Verzögerung auszuführen, aber es muss getan werden, während der Benutzer mit einem Bildlauf/Scrolling auf UIScrollView.iOS: Aktion nach Zeit ausführen, während Benutzer interagiert/scrollt

Ich bin mir nicht sicher, warum weder performSelector:withObject:afterDelay oder scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: feuern wird. Liegt es an einem Hintergrund-Thread?

Irgendwelche Vorschläge oder Hilfe?

+0

Was mit perform nicht funktioniert: nachVerlegen :? Was versuchst du zu tun? Sind Sie sicher, dass sie nicht feuern - d. H., Sie haben eine NSLog-Anweisung zur Überprüfung eingereicht? –

+0

Ich habe eine Log-Anweisung eingegeben. Es wird ausgelöst, nachdem der Benutzer die Interaktion mit dem Bildschirm beendet hat. Ich versuche ein Label zu aktualisieren. – RileyE

+0

Ich habe das gefunden: http://stackoverflow.com/questions/2865760/performselectorwithobjectafteredelay-not-working-from-crollviewdidzoom, aber es gibt keine Möglichkeit, eine Verzögerung damit zu integrieren. – RileyE

Antwort

23

Sowohl NSTimer als auch performSelector:withObject:afterDelay: werden standardmäßig nur im normalen Run-Loop-Modus ausgelöst. Beim Scrollen befindet sich die Laufschleife im Ereignisverfolgungsmodus.

Sie haben Ihre timed Aktion in alle gängigen Modi planen:

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

oder

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

Es gibt auch die engagierte NSEventTrackingRunLoopMode.

+0

Also, es ist genau das, was ich in dem Kommentar habe? – RileyE

+0

@RileyE Ich bin mir nicht sicher, ob ich verstehe, was du meinst. Welcher Kommentar? –

+0

Entschuldigung. Ich bin sehr vage! Der Kommentar, in dem ich einen Eintrag erwähne, den ich vorher angeschaut habe. Der Beitrag lautet: http://stackoverflow.com/questions/2865760/performselectorwithobjectafteredelay-not-working-from-scrollviewdidzoom – RileyE

4

Stellen Sie sicher, dass der verzögerte Trigger auf NSRunLoopCommonModes erfolgt. Der Standardwert ist NSDefaultRunLoopMode, der keine Nachrichten empfängt, während z. scrollen.

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

Alternativ können Sie GCD verwenden, die auch die gleiche Art und Weise verhält (nicht sicher, welche Runloop Modus nutzt)

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

Für Swift:

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