Есть ли способ отменить dispatch_after(), запланированный на некоторое время в будущем, и пока не уволен? Я пытаюсь сделать что-то вроде планировщика для обновлений с сервера, и этот метод так же, как я хочу, но мне бы хотелось в какой-то момент отменить его и перепланировать. Возможно ли вообще или мне нужно отступить и использовать NSTimer?
Отменить метод dispatch_after()?
Ответ 1
Нет способа предотвратить выполнение диспетчер_блока после его отправки в очередь, что означает, что ваш dispatch_after не может быть отменен. Единственный вариант - добавить в свой блок условие, которое нужно проверить во время выполнения, чтобы предотвратить выполнение. то есть.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^ {
if(self.shouldExecuteDispatchBlock)
{ // do your stuff } });
Ответ 2
ОК, поэтому, со всеми собранными ответами и возможными решениями, кажется лучшим для этого случая (сохраняя простоту), вызывает performSelector:withObject:afterDelay:
и отменяя его при вызове cancelPreviousPerformRequestsWithTarget:
по желанию. В моем случае - перед расписанием следующего отложенного вызова:
[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self];
[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay];
Ответ 3
С этой целью я использовал этот класс:
https://github.com/SebastienThiebaud/dispatch_cancelable_block
вы можете вызвать функцию cancel(), чтобы отменить выполнение того, что в блоке.
Ответ 4
Используйте источник таймера отправки (это то, что dispatch_after
использует внутренне в любом случае).
Источник таймера отправки может быть отменен или его параметры таймера изменены после создания.