Отмена очереди в исполненииSelector: afterDelay calls
знает ли кто-нибудь, возможно ли отменить уже поставленные события селектора из стека событий или стека таймера (или какой-либо механизм, который используется API), когда вы вызываете performSelector:withObject:afterDelay
?
Я использовал этот стек событий для изменения атрибутов изображения на вкладке TabBar и иногда ставил в очередь до 10 секунд изменений в одном быстро исполняемом цикле... может быть, 5 миллисекунд или около того.
проблема возникает, если пользователь переключает вкладки... например, скажем, у меня есть изменения изображений, поставленные в очередь для изображения, которое отображается, как только Tab # 4 включен, а затем пользователь быстро переключается на Tab # 3, а затем вправо вернемся к вкладке № 4... это снова переустановит дополнительные изменения в 10 секунд, пока старая очередь все еще будет играть, вероятно, около 2 или 3 секунд в очередь, если она будет достаточно быстрой, но даже при достижении 5 секунд в поток возникла проблема.
поэтому мне нужно было каким-то образом отменить старый стек изменений, прежде чем положить новый стек...
Я пишу этот запрос в прошедшем времени, потому что я уже придумал альтернативное решение этой проблемы, добавив фильтр событий с подсветкой в функцию воспроизведения. однако мне все еще любопытно, возможно ли аннулирование мероприятия, потому что у меня такое ощущение, что такое знание пригодится в будущем. спасибо за любую оказанную помощь:)
Ответы
Ответ 1
[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
Если вы ищете "performSelector", чтобы иметь соответствующий "cancelPreviousPerformSelector"... это не так. (Фу, Яблоко, почему ты так поступил со мной?)
Методы сравнения: a, ah,
performSelector
cancelPreviousPerformRequestsWithTarget
(Просто чтобы сделать его сложным для запоминания, без поиска документов.)
Ответ 3
Чтобы отменить все предыдущие запросы выполнения, вы можете использовать:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
Ответ 4
Проверьте документы NSRunLoop. Вы хотите -cancelPerformSelectorsWithTarget: