отмена поставленных в очередь вызовов performSelector: afterDelay

115

Кто-нибудь знает, можно ли отменить уже поставленные в очередь события селектора из стека событий или стека таймера (или любого другого механизма, который используется API) при вызове performSelector:withObject:afterDelay?

Я использовал этот стек событий для изменения атрибутов изображения на вкладке TabBar и иногда ставил в очередь до 10 секунд изменений в одном быстро выполняемом цикле for ... может быть, 5 миллисекунд или около того.

проблема возникает, если пользователь переключает вкладки ... например, у меня есть изменения изображения в очереди для изображения, которое отображается, как только Вкладка №4 включена, а затем пользователь быстро переключается на Вкладку №3, а затем обратно на вкладку # 4 ... это будет затем повторно ставить в очередь еще 10 секунд изменений, в то время как старая очередь все еще играет, вероятно, около 2 или 3 секунд в очереди, если переключаться достаточно быстро ... но даже достигнув 5 секунд до поток был проблемой.

поэтому мне нужно было каким-то образом отменить старый стек изменений, прежде чем вставлять новый стек ...

Я пишу этот запрос в прошедшем времени, потому что я уже придумал альтернативное решение этой проблемы, добавив фильтр событий с «ястребиными глазами» в функцию воспроизведения. однако мне все еще любопытно, возможна ли отмена мероприятия, потому что я чувствую, что такие знания пригодятся в будущем. спасибо за любую оказанную помощь :)

eerok512
источник
как вы могли бы использовать фильтр событий с «ястребиными глазами» для функции воспроизведения?
Maniganda saravanan

Ответы:

241
[NSObject cancelPreviousPerformRequestsWithTarget:]

или

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

Это targetисходный объект, для которого performSelector:afterDelay:был вызван.

Например:

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

См. Документацию по яблоку , она находится прямо в конце performSelector:withObject:afterDelay:описания.

stefanB
источник
33
Чтобы прояснить его использование, попробуйте следующее: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson 01
[NSObject cancelPreviousPerformRequestsWithTarget: селектор собственной личности: @selector (mySel :) объект: nil];
webtrick101
2

Чтобы отменить все предыдущие запросы на выполнение, вы можете использовать:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
Марко Мирисола
источник
2

Если вы ищете для "performSelector" соответствие " cancelPreviousPerformSelector" ... это не так. (Ух, Apple, почему ты так со мной делаешь ???)

Методы "сопоставления":

performSelector

cancelPreviousPerformRequestsWithTarget

(Просто чтобы его было сложно запомнить, без поиска в документации.)

Ирэн
источник
1

Проверьте документы NSRunLoop. Вы хотите-cancelPerformSelectorsWithTarget:

NSResponder
источник