Abbrechen von PerformSelector in der Warteschlange: afterDelay-Aufrufe

115

Weiß jemand, ob es möglich ist, bereits in der Warteschlange befindliche Selektorereignisse vom Ereignisstapel oder Timer-Stapel (oder von welchem ​​Mechanismus auch immer, der von der API verwendet wird) abzubrechen, wenn Sie aufrufen performSelector:withObject:afterDelay?

Ich habe diesen Ereignisstapel verwendet, um die Attribute eines Bildes innerhalb einer TabBar-Registerkarte zu ändern, und habe manchmal Änderungen im Wert von bis zu 10 Sekunden in einer schnell ausgeführten for-Schleife in die Warteschlange gestellt ... vielleicht 5 Millisekunden oder so.

Das Problem tritt auf, wenn der Benutzer die Tabs wechselt ... wie zum Beispiel, wenn die Bildänderungen für ein Bild in die Warteschlange gestellt werden, das angezeigt wird, sobald Tab 4 aktiviert ist, und der Benutzer dann schnell zu Tab 3 und dann direkt zurück zu Tab wechselt # 4 ... dies würde dann Änderungen im Wert von weiteren 10 Sekunden in die Warteschlange stellen, während die alte Warteschlange noch abgespielt wird, wahrscheinlich etwa 2 oder 3 Sekunden in der Warteschlange, wenn sie schnell genug umgeschaltet wird ... aber sogar 5 Sekunden später Der Stream war ein Problem.

Also brauchte ich eine Möglichkeit, den alten Stapel von Änderungen abzubrechen, bevor ich einen neuen Stapel auflegte ...

Ich schreibe diese Abfrage in der Vergangenheitsform, weil ich bereits eine alternative Lösung für dieses Problem gefunden habe, indem ich der Wiedergabefunktion einen Ereignisfilter mit Falkenaugen hinzugefügt habe. Ich bin jedoch immer noch gespannt, ob eine Absage der Veranstaltung möglich ist, da ich der Meinung bin, dass dieses Wissen in Zukunft nützlich sein wird. Vielen Dank für jede Hilfe :)

eerok512
quelle
Wie können Sie den Hawk-Eyed-Ereignisfilter für die Wiedergabefunktion verwenden?
Maniganda Saravanan

Antworten:

241
[NSObject cancelPreviousPerformRequestsWithTarget:]

oder

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

Das targetist das ursprüngliche Objekt, auf dem performSelector:afterDelay:aufgerufen wurde.

Beispielsweise:

// schedule the selector
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0];
// cancel the above call (and any others on self)
[NSObject cancelPreviousPerformRequestsWithTarget:self];

Siehe Apple Docs , es ist direkt am Ende der performSelector:withObject:afterDelay:Beschreibung.

stefanB
quelle
33
Versuchen Sie Folgendes, um die Verwendung zu verdeutlichen: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson
[NSObject cancelPreviousPerformRequestsWithTarget: Selbstselektor: @selector (mySel :) Objekt: nil];
webtrick101
2

Um alle vorherigen Ausführungsanforderungen abzubrechen, können Sie Folgendes verwenden:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
Marco Mirisola
quelle
2

Wenn Sie nach "performSelector" suchen, um das passende " cancelPreviousPerformSelector" zu haben ... dann nicht. (Ugh, Apple, warum tust du mir das an ???)

Die, ähm, ah, "passenden" Methoden sind:

performSelector

cancelPreviousPerformRequestsWithTarget

(Nur um es besonders schwer zu machen, sich zu erinnern, ohne die Dokumente zu durchsuchen.)

Irene
quelle
1

Überprüfen Sie die NSRunLoop-Dokumente. Sie wollen-cancelPerformSelectorsWithTarget:

NSResponder
quelle