Ich muss eine Verzögerung zwischen der Ausführung von zwei Zeilen in einer (gleichen) Funktion hinzufügen. Gibt es dafür günstige Möglichkeiten?
Hinweis: Ich benötige dazu keine zwei verschiedenen Funktionen, und die Verzögerung darf die Ausführung anderer Funktionen nicht beeinflussen.
z.B:
line 1: [executing first operation];
line 2: Delay /* I need to introduce delay here */
line 3: [executing second operation];
Jede Hilfe ist spürbar. Danke im Voraus...
objective-c
delay
execution
Krishna Raj Salim
quelle
quelle
Sie können die
NSThread
Methode verwenden:[NSThread sleepForTimeInterval: delay];
Wenn Sie dies jedoch im Hauptthread tun, blockieren Sie die App. Tun Sie dies also nur in einem Hintergrundthread.
oder in Swift
NSThread.sleepForTimeInterval(delay)
in Swift 3
quelle
Diese Zeile ruft nach 3 Sekunden den Selektor secondMethod auf:
[self performSelector:@selector(secondMethod) withObject:nil afterDelay:3.0 ];
Verwenden Sie es bei Ihrer zweiten Operation mit der gewünschten Verzögerung. Wenn Sie viel Code haben, platzieren Sie ihn in einer eigenen Methode und rufen Sie diese Methode mit auf
performSelector:
. Es wird die Benutzeroberfläche nicht wie blockierensleep
Bearbeiten: Wenn Sie keine zweite Methode möchten, können Sie eine Kategorie hinzufügen, um Blöcke mit performSelector verwenden zu können:
@implementation NSObject (PerformBlockAfterDelay) - (void)performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay { block = [block copy]; [self performSelector:@selector(fireBlockAfterDelay:) withObject:block afterDelay:delay]; } - (void)fireBlockAfterDelay:(void (^)(void))block { block(); } @end
Oder vielleicht sogar sauberer:
void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void)) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay), dispatch_get_current_queue(), block); }
quelle
performSelector
: stackoverflow.com/questions/4007023/…[self performBlock:^{ your_code } afterDelay:0.1];
Ich habe ein paar rundenbasierte Spiele, bei denen die KI eine Pause einlegen muss, bevor sie an die Reihe kommt (und zwischen den Schritten in ihrem Zug). Ich bin sicher, dass es andere, nützlichere Situationen gibt, in denen eine Verzögerung die beste Lösung ist. In Swift:
let delay = 2.0 * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue()) { self.playerTapped(aiPlayView) }
Ich bin gerade hierher zurückgekommen, um zu sehen, ob die Objective-C-Aufrufe unterschiedlich waren. (Ich muss dies auch zu diesem hinzufügen.)
quelle
Wenn Sie auf iOS 4.0+ abzielen, können Sie Folgendes tun:
[executing first operation]; 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){ [executing second operation]; });
quelle
Der derzeit bequemste Weg: Xcode bietet dazu ein Code-Snippet, bei dem Sie nur den Verzögerungswert und den Code eingeben müssen, den Sie nach der Verzögerung ausführen möchten.
+
Schaltfläche oben rechts in Xcode.after
quelle
Wie @Sunkas schrieb,
performSelector:withObject:afterDelay:
ist das Pendant zu demdispatch_after
nur, dass es kürzer ist und Sie die normaleobjective-c
Syntax haben. Wenn Sie Argumente an den Block übergeben müssen, den Sie verzögern möchten, können Sie sie einfach über den Parameter übergebenwithObject
und Sie erhalten sie in demselector
Aufruf:[self performSelector:@selector(testStringMethod:) withObject:@"Test Test" afterDelay:0.5]; - (void)testStringMethod:(NSString *)string{ NSLog(@"string >>> %@", string); }
Wenn Sie sich dennoch selbst auswählen möchten, ob Sie es im Hauptthread oder im aktuellen Thread ausführen, gibt es bestimmte Methoden, mit denen Sie dies angeben können. In der Apples-Dokumentation heißt es:
quelle