2009-11-27 13 views
109

czy ktoś wie, czy możliwe jest anulowanie już w kolejce zdarzeń selektora ze stosu zdarzeń lub stosu zegara (lub innego mechanizmu, który jest wykorzystywany przez interfejs API) podczas wywoływania performSelector:withObject:afterDelay?anulowanie kolejkowania performSelector: afterDelay wywołania

Używałem tego stosu zdarzeń do zmiany atrybutów obrazu w zakładce TabBar, a czasami ustawiałem w kolejce do 10 sekund wartości zmian w jednej szybko wykonanej pętli ... może 5 milisekund lub więcej.

Problem powstaje, gdy użytkownik przełącza zakładki ... np. Mówię, że w kolejce pojawiły się zmiany obrazu dla obrazu wyświetlanego zaraz po włączeniu Tab. 4, a następnie użytkownik szybko przechodzi do Tab. 3, a następnie wracając do Tab # 4 ... to wtedy ponownie ustawiłoby kolejną zmianę wartą 10 sekund, podczas gdy stara kolejka wciąż grała, prawdopodobnie około 2 lub 3 sekund do kolejki, jeśli przełączono wystarczająco szybko ... ale nawet przybywając do 5 sekund do strumienia było problemem.

więc potrzebny jakiś sposób, aby anulować starą stos zmian przed wprowadzeniem nowego stosu na ...

Piszę tę kwerendę w czasie przeszłym, bo już przyszedł z alternatywnego rozwiązania tego problem poprzez dodanie filtra zdarzeń o jastrzębich oczach w funkcji odtwarzania. jednak nadal jestem ciekawy, czy anulowanie wydarzenia jest możliwe, ponieważ mam wrażenie, że taka wiedza przyda się w przyszłości. dziękuję za wszelką pomoc świadczonych :)

+0

jak można użyć filtra zdarzeń hawk-eyed funkcję odtwarzania? –

Odpowiedz

227
[NSObject cancelPreviousPerformRequestsWithTarget:] 

lub

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:] 

target jest oryginalny obiekt, na którym performSelector:afterDelay: nazwano.

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 apple docs, to na samym końcu opisu performSelector:withObject:afterDelay:.

+33

Aby uzyskać wyjaśnienia dotyczące jego użycia, spróbuj tego: [NSObject cancelPreviousPerformRequestsWithTarget: self]; – dnstevenson

+2

Edytowane w celu wykorzystania Twojego komentarza - dziękuję dnstevenson! – Tim

+0

Doskonała odpowiedź! – pmk

1

Sprawdź dokumentację NSRunLoop. Chcesz -cancelPerformSelectorsWithTarget:

2

Jeśli szukasz "performSelector", aby pasował do "cancelPreviousPerformSelector" ... to nie jest. (Fuj, jabłko, dlaczego mi to zrobić ???)

The, er, ah, "dopasowania" metody są: performSelector cancelPreviousPerformRequestsWithTarget

(Wystarczy aby dodatkowo trudne do zapamiętania, . bez szukania docs)

2

aby anulować wszystkie wcześniejsze wykonać żądania, można użyć:

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
Powiązane problemy