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 :)
quelle
Antworten:
oder
Das
target
ist das ursprüngliche Objekt, auf demperformSelector:afterDelay:
aufgerufen wurde.Beispielsweise:
Siehe Apple Docs , es ist direkt am Ende der
performSelector:withObject:afterDelay:
Beschreibung.quelle
Um alle vorherigen Ausführungsanforderungen abzubrechen, können Sie Folgendes verwenden:
quelle
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:
(Nur um es besonders schwer zu machen, sich zu erinnern, ohne die Dokumente zu durchsuchen.)
quelle
Überprüfen Sie die NSRunLoop-Dokumente. Sie wollen
-cancelPerformSelectorsWithTarget:
quelle