Frage

weiß jemand, wenn es möglich ist, bereits in der Warteschlange Selektor Ereignisse aus dem Ereignisstack oder Timer-Stack löschen (oder was auch immer Mechanismus ist es, dass durch die API genutzt wird), wenn Sie performSelector:withObject:afterDelay nennen?

Ich war mit diesem Event Stapel die Attribute eines Bildes innerhalb einer TabBar Registerkarte zu ändern, und manchmal bis zu 10 Sekunden im Wert von Änderungen in einem schnell für Schleife ausgeführt Schlange würde ... vielleicht 5 Millisekunden oder so.

stellt sich das Problem, wenn der Benutzer mit der Tabulatortaste schaltet ... wie sagen, ich habe die Bildänderungen für ein Bild der Warteschlange, die sofort angezeigt wird, wie Tab # 4 aktiviert ist, und dann schnell der Benutzer wechselt in Tab # 3 und dann nach rechts zurück zum Tab # 4 ... dies würde dann wieder Warteschlange weitere 10 Sekunden im wert von Veränderungen, während die alte Warteschlange noch spielt, wahrscheinlich um 2 oder 3 Sekunden in die Warteschlange, wenn schnell genug geschaltet ... aber selbst bei 5 Ankunft Sekunden in den Stream ist ein Problem aufgetreten.

so dass ich einen Weg benötigt, um den alten Stapel von Änderungen abzubrechen, bevor einen neuen Stapel setzt auf ...

Ich schreibe diese Abfrage in der Vergangenheit, weil ich schon mit einer alternativen Lösung für dieses Problem auf der Wiedergabefunktion durch Hinzufügen eines Habicht Augen Ereignisfilter kam. aber ich bin immer noch neugierig, wenn Absage der Veranstaltung möglich ist, weil ich das Gefühl, ein solches Wissen haben in der Zukunft nützlich sein wird. Vielen Dank für jede Unterstützung gemacht:)

War es hilfreich?

Lösung

[NSObject cancelPreviousPerformRequestsWithTarget:]

oder

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

Die target ist das ursprüngliche Objekt, auf dem performSelector:afterDelay: genannt wurde.

Zum Beispiel:

// 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

Andere Tipps

Um alle bisherigen führen Anfragen zu stornieren, können Sie verwenden:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   

Wenn Sie für „perform“ suchen sein Matching „cancelPreviousPerformSelector“ haben ... es funktioniert nicht. (Ugh, Apfel, warum machst du das für mich ???)

Das, äh, ah, "matching" Methoden sind:

performSelector

cancelPreviousPerformRequestsWithTarget

(Nur um es besonders schwer zu merken, ohne die Dokumentation zu suchen.)

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top