отмена очереди executeSelector: afterDelay вызывает
-
05-07-2019 - |
Вопрос
кто-нибудь знает, возможно ли отменить уже помещенные в очередь события селектора из стека событий или стека таймеров (или любого другого механизма, который используется API), когда вы вызываете executeSelector: withObject: afterDelay
?
Я использовал этот стек событий для изменения атрибутов изображения на вкладке TabBar и иногда помещал в очередь до 10 секунд изменений в одном быстро выполняемом цикле ... возможно, 5 миллисекунд или около того.
проблема возникает, если пользователь переключает вкладки ... как, скажем, у меня есть изменения изображения в очереди для изображения, которое отображается, как только вкладка 4 включена, а затем пользователь быстро переключается на вкладку № 3 и затем вправо вернуться к вкладке № 4 ... это приведет к повторной очереди изменений на 10 секунд, пока старая очередь все еще воспроизводится, вероятно, через 2 или 3 секунды в очередь, если переключиться достаточно быстро ... но даже при достижении 5 секунд в потоке была проблема.
поэтому мне нужно было как-то отменить старый стек изменений, прежде чем помещать новый стек в ...
Я пишу этот запрос в прошедшем времени, потому что я уже придумал альтернативное решение этой проблемы, добавив фильтр событий с «ястребиными глазами» в функцию воспроизведения. однако мне все еще любопытно, возможна ли отмена мероприятия, потому что я чувствую, что такие знания пригодятся в будущем. спасибо за любую оказанную помощь:)
Решение
[NSObject cancelPreviousPerformRequestsWithTarget:]
или
[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]
target
- это исходный объект, для которого был вызван executeSelector: 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];
См. яблочные документы , он находится в конце описания executeSelector: withObject: afterDelay:
.
Другие советы
Чтобы отменить все предыдущие запросы на выполнение, вы можете использовать:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
Если вы ищете "executeSelector" иметь соответствующий
"Ну, ах," соответствие " методы:
performSelector
cancelPreviousPerformRequestsWithTarget
(просто чтобы его было сложнее запомнить без поиска в документах.)
Проверьте документы NSRunLoop. Вы хотите -cancelPerformSelectorsWithTarget: