Подтвердить что ты не робот

Отменить метод dispatch_after()?

Есть ли способ отменить dispatch_after(), запланированный на некоторое время в будущем, и пока не уволен? Я пытаюсь сделать что-то вроде планировщика для обновлений с сервера, и этот метод так же, как я хочу, но мне бы хотелось в какой-то момент отменить его и перепланировать. Возможно ли вообще или мне нужно отступить и использовать NSTimer?

4b9b3361

Ответ 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];

Ответ 4

Используйте источник таймера отправки (это то, что dispatch_after использует внутренне в любом случае).

Источник таймера отправки может быть отменен или его параметры таймера изменены после создания.