2013-03-19 9 views
12

ich das erkennen kann durch die Verwendung erfolgen:Verzögerung eine Call-Methode in Objective-c

[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0] 

jedoch das Problem ist, dass ich nur ein Methodenaufruf tut, geschehe will. Mit dieser Funktion werden die Anrufe übereinander gestapelt. Ich möchte einen Anruf tätigen und wenn ein weiterer Anruf getätigt wird, wird der erste Anruf abgewiesen. Ideen? Der Versand nach der Party, die wie folgt aussieht:

+3

'performSelector: withObject: afterDelay:' führt den Selektor ** genau einmal durch. ** Ich sehe nicht, was dein Problem ist. –

+1

Versuchen Sie, mehrere 'performes' aufzurufen und dann nur die letzte auszuführen? –

+0

Ja, Inder. Das will ich genau machen. Entschuldigung für Unklarheiten. – Michael

Antwort

14

Sobald das Verfahren dann ausgeführt wird gibt es keine Möglichkeit, es zu stoppen.

Aber Sie können abbrechen, wenn es nicht ausgelöst wird. Sie können Sie Anfrage vorherige ausführen stornieren können nur auf diese Weise so etwas wie diese

//.... your code 
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil]; 
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]; 
//.... your code 

tun, wenn die myMethod nicht gefeuert zu werden.

+0

Ausgezeichnet, danke! – Michael

+0

Ich könnte Ihren Tipp für einen inkrementellen Tastensatz (hier: UP und DOWN) perfekt verwenden, der seinen Wert nicht sofort auf eine Hardware übertragen sollte. Bei jedem Tippen wird der Timer zurückgesetzt, bis der letzte Tap den endgültigen Wert auslöst. –

13

Sie im Code-Snippet-Bibliothek in Xcode Sie nannte man GCD finden

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#> 
    }); 

ziemlich selbsterklärend.

+0

+1 Dies ist genau das, was ich gesucht habe. Diese Implementierung ist großartig, weil Sie vollständige Methodenaufrufe machen können, selbst wenn sie mehrere Parameter haben und es nett aussieht. Auch, wie Sie sagten, selbsterklärend, sowohl für den Programmierer als auch für alle folgenden Entwickler. – Firo

2

Sie sollten diesen Selektor in einem anderen Thread ausführen, um Stapel wie gewünscht zu vermeiden. verwenden

[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)]; 

In diesem Selektor Sie Verzögerung hinzufügen können, was immer Sie wollen. Da dieser Prozess, so dass andere für die Verzögerung

2

EDIT stoppt nicht in separaten Thread ausgeführt wird:

[self cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil]; 

Siehe this link: Nun, da ich weiß, dass Sie die aktuellste nur verwenden möchten, können Sie stattdessen verwenden könnte Für mehr Information.

ORIGINAL POST:

Sie könnten nur einen BOOL haben, die auf NO gesetzt ist, wenn es diesen Abschnitt erreicht und wird dann auf JA zurückgesetzt, nachdem das Verfahren durchgeführt wird.

So zum Beispiel, wäre es etwas wie folgt aussehen:

if (boolVal) { 
    boolVal = NO; 
    [self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]; 
} 

dann in Ihrem myMethod haben:

boolVal = YES;