отмена очереди executeSelector: afterDelay вызывает - PullRequest
114 голосов
/ 27 ноября 2009

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

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

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

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

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

Ответы [ 4 ]

237 голосов
/ 27 ноября 2009
[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];

См. Apple Docs , это в конце описания performSelector:withObject:afterDelay:.

2 голосов
/ 30 июля 2013

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

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
2 голосов
/ 08 февраля 2011

Если вы ищете для "executeSelector", чтобы оно соответствовало "cancelPreviousPerformSelector" ... это не так. (Тьфу, Эппл, почему ты так со мной поступаешь?)

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

performSelector

cancelPreviousPerformRequestsWithTarget

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

1 голос
/ 27 ноября 2009

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

...