скасування черги performSelector: виклики afterDelay


115

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

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

проблема виникає, якщо користувач перемикає вкладки ... як скажімо, у мене внесення змін до черги для зображення, яке відображається, як тільки ввімкнено вкладку №4, а потім користувач швидко переходить на вкладку №3, а потім знову на вкладку # 4 ... це призведе до повторної черги ще на 10 секунд, варто змінити, коли стара черга все ще грала, ймовірно, приблизно 2 або 3 секунди до черги, якщо переключитися досить швидко ..., але навіть приїхавши о 5 секунд до потік був проблемою.

тому мені знадобився якийсь спосіб скасувати старий стек змін, перш ніж ставити новий стек ...

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


як ви могли використовувати фільтр подій з яструбими очима для функції відтворення?
Маніганда сараванан

Відповіді:


241
[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];

Дивіться яблучні документи , це справа в кінці performSelector:withObject:afterDelay:опису.


33
Щоб отримати додаткові роз'яснення щодо його використання, спробуйте це: [NSObject cancelPreviousPerformRequestsWithTarget: self];
dnstevenson

[NSObject cancelPreviousPerformRequestsWithTarget: self select: @selector (mySel :) object: nil];
webtrick101

2

Щоб скасувати всі попередні запити на виконання, ви можете використовувати:

[NSObject cancelPreviousPerformRequestsWithTarget:self];   

2

Якщо ви шукаєте "performSelector", щоб відповідати " cancelPreviousPerformSelector" ... це не так. (Фу, Apple, чому ти мені це робиш ???)

Методи "відповідності", "er, ah", є:

performSelector

cancelPreviousPerformRequestsWithTarget

(Просто для того, щоб зробити це важко запам’ятати, не шукаючи документів.)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.