Подтвердить что ты не робот

Отмена очереди в исполненииSelector: afterDelay calls

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

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

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

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

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

4b9b3361

Ответ 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: