Richtige Art und Weise zu verzögern, wobei die Schlinge weiter zu
Ich habe ein Bedürfnis, zu verzögern, für eine gewisse Zeit, aber doch zulassen, dass andere Dinge auf der gleichen runloop laufen zu halten. Ich habe mit dem folgenden code, um dies zu tun:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
Diese scheint genau das zu tun, was ich will, außer, dass manchmal die Funktion kehrt sofort ohne Wartezeit die gewünschte Zeit (1 Sekunde).
Kann jemand lassen Sie mich wissen, was könnte dies verursachen? Und was ist der richtige Weg, zu warten, während es die run loop zu laufen?
HINWEIS: ich möchte die Verzögerung in einer ähnlichen Weise wie sleep(), so dass nach der Verzögerung bin ich wieder in der gleichen Ausführung als stream vor.
- Was ist es, dass Sie möchten, zu verzögern? Haben Sie sah
dispatch_after
? - Ich möchte die Verzögerung von den aktuellen thread, so ähnlich wie sleep(), außer ich will die runloop weiter laufen lassen (also andere Ereignisse und Dinge kann kick in) während dieser Verzögerungszeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden, GCD und
dispatch_after
für, die. Es ist wesentlich Aktueller und effizienter (und thread-safe und alle), und sehr einfach zu bedienen.Gibt es sogar einen code-Schnipsel, eingebettet in Xcode, so dass, wenn Sie mit der Eingabe beginnen
dispatch_after
es schlägt snippet und wenn Sie überprüfen, schreiben die vorbereitet sind 2-3 Linien für Sie im code 🙂[NSThread sleepForTimeinterval:]
oderusleep()
?) aber das macht eine aktive pause, die nicht empfohlen in der richtigen OOP-Programmierung Muster. Und wenn Sie ausführen der for-Schleife der main runloop, natürlich wird er das "einfrieren" Ihrer Anwendung. Also das ist eher schlechtes design.for(int i=0;i<N;++i) { dispatch_after(N seconds, mainQueue, ^{ ... }); }
so, dass Ihre Schleife Zeitplan Ndispatch_after
Anrufe, die N-te iteration geplant werden N Sekunden nach der aktuellen Zeit. Oder führen Sie Ihre iteration mit etwas anderem als mit einer herkömmlichen for-Schleife, wie rekursiver code aufruftdispatch_after
am Ende der iteration planen die nächste iteration 1 Sekunde später.Verwenden Sie einen NSTimer, das Feuer aus einen Anruf an eine Methode nach einer bestimmten Verzögerung.
Der akzeptiert, SO die Antwort hier sollte helfen. Sie können auch implementieren, David dispatch_afer (hier erklärt), die eine mehr up-to-date Weise, das gleiche zu tun, mit GCD.
Gibt es mehrere GCD Funktionen wie diese, die es Wert sind, zu wissen, und Sie sind sehr einfach zu bedienen.
Haben Sie versucht
performSelector:withObject:afterDelay:
?Aus der Apple-Dokumentation
Ich hatte ein ähnliches Problem und dies ist meine Lösung. Hoffe es klappt auch für andere.