Вопрос

кто-нибудь знает, возможно ли отменить уже помещенные в очередь события селектора из стека событий или стека таймеров (или любого другого механизма, который используется 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" иметь соответствующий cancelPreviousPerformSelector > ... нет. (Тьфу, Эппл, почему ты так со мной поступаешь?)

"Ну, ах," соответствие " методы:

performSelector

cancelPreviousPerformRequestsWithTarget

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top