anulowanie wywołań w kolejce performSelector: afterDelay

115

Czy ktoś wie, czy podczas wywoływania możliwe jest anulowanie już ustawionych w kolejce zdarzeń selektora ze stosu zdarzeń lub stosu czasomierza (lub jakiegokolwiek mechanizmu używanego przez API) performSelector:withObject:afterDelay?

Używałem tego stosu zdarzeń do zmiany atrybutów obrazu na karcie TabBar i czasami umieszczałem w kolejce do 10 sekund zmian w jednej szybko wykonywanej pętli for ... może około 5 milisekund.

problem pojawia się, gdy użytkownik przełącza karty ... na przykład, że mam zmiany obrazu w kolejce do obrazu, który jest wyświetlany, gdy tylko karta nr 4 jest włączona, a następnie użytkownik szybko przełącza się na kartę nr 3, a następnie z powrotem do karty # 4 ... spowodowałoby to ponowne umieszczenie w kolejce kolejnych 10 sekund zmian, podczas gdy stara kolejka nadal grała, prawdopodobnie około 2 lub 3 sekund w kolejce, jeśli zostanie przełączona wystarczająco szybko ... ale nawet dotrze w 5 sekund do strumień był problemem.

więc potrzebowałem jakiegoś sposobu, aby anulować stary stos zmian przed umieszczeniem nowego stosu ...

Piszę to zapytanie w czasie przeszłym, ponieważ wymyśliłem już alternatywne rozwiązanie tego problemu, dodając filtr zdarzeń jastrzębiego oka w funkcji odtwarzania. jednak nadal jestem ciekawy, czy odwołanie imprezy jest możliwe, bo mam przeczucie, że taka wiedza przyda się w przyszłości. dziękuję za udzieloną pomoc :)

eerok512
źródło
jak można użyć filtru zdarzeń „jastrzębiego oka” w funkcji odtwarzania?
Maniganda saravanan

Odpowiedzi:

241
[NSObject cancelPreviousPerformRequestsWithTarget:]

lub

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

Jest targetto oryginalny obiekt, na którym performSelector:afterDelay:został wywołany.

Na przykład:

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

Zobacz dokumentację Apple , jest na końcu performSelector:withObject:afterDelay:opisu.

stefanB
źródło
33
Aby uzyskać wyjaśnienia dotyczące jego użycia, spróbuj tego: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson
[NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector (mySel :) obiekt: nil];
webtrick101
2

W celu anulowania wszystkich wcześniejszych zleceń wykonania możesz skorzystać z:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
Marco Mirisola
źródło
2

Jeśli szukasz elementu „performSelector”, aby dopasować go do „ cancelPreviousPerformSelector”… tak nie jest. (Ugh, Apple, dlaczego mi to robisz ???)

Metody „dopasowywania” to:

performSelector

cancelPreviousPerformRequestsWithTarget

(Tylko po to, żeby było to wyjątkowo trudne do zapamiętania, bez przeszukiwania dokumentów.)

Irene
źródło
1

Sprawdź dokumentację NSRunLoop. Chcesz-cancelPerformSelectorsWithTarget:

NSResponder
źródło