Задержка вызова метода в objective-c
Я знаю, что это можно сделать, используя:
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
Однако проблема заключается в том, что мне нужен только один вызов метода.
С помощью этой функции вызовы будут складываться друг на друга. Я хочу позвонить, и если будет сделан другой звонок, первый будет уволен. Идеи?
Ответы
Ответ 1
Как только метод выполняется, нет способа остановить его.
Но вы можете отменить, если он не уволен. Вы можете сделать что-то вроде этого
//.... your code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
//.... your code
Таким образом вы можете отменить предыдущий запрос выполнения, только если myMethod
не запускается.
Ответ 2
В библиотеке фрагментов кода в Xcode вы можете найти один из них: GCD: Dispatch After, который выглядит следующим образом:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
<#code to be executed on the main queue after delay#>
});
Довольно понятный.
Ответ 3
Вы должны выполнить этот селектор в каком-то другом потоке, чтобы избежать стека, как вы просили.
используйте
[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)];
В этом селекторе вы можете добавить задержку, что захотите. Поскольку этот процесс будет выполняться в отдельном потоке, чтобы не останавливать других для задержки
Ответ 4
EDIT: теперь, когда я знаю, что вы хотите использовать только самые последние, вы могли бы использовать:
[self cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
Подробнее см. эту ссылку.
ОРИГИНАЛЬНАЯ ПОЧТА:
У вас может быть только BOOL, который установлен в NO, когда он достигнет этого раздела, а затем reset - YES после выполнения метода.
Так, например, это выглядело бы так:
if (boolVal) {
boolVal = NO;
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
}
то в вашем myMethod:
boolVal = YES;