Как остановить и приостановить действие DispatchQueue.main.asyncAfter


#1

Подскажите как в игре при нажатии на паузу остановить уже запущенный DispatchQueue?

У меня в игре есть предупреждение о появлении препятствия в игровой сцене, с начала создания этого объекта запускается отложенный метод диспач, если в момент анимации предупреждения на нажимаю на паузу, диспач не останавливает свое действие и все равно удаляет объект через заданное время

DispatchQueue.main.asyncAfter(wallDeadline: .now() + .milliseconds(3300)) {
                        self.warningObject.removeAllChildren()
                    }

#2

Можно создать булевую переменную которой ставить true при нажатии на паузу, а в диспатче проверять, если булевая переменная в true то не удалять объект


#3

Но суть в том, что когда в диспатче будет идти проверка булевой переменной там будет false и диспач сразу запустит отложенное выполнение действия, а когда я нажму паузу и переменная изменится на true, будет поздно, так как проверка в дисптче уже была и отложенное действие уже запланировано, не так? То есть если я нажму именно в промежуток 3300 миллисекунд, то есть в промежутке 3.3 секунды


#4

Код внутри блока выполнится с указанной отсрочкой. Через 3.3 секунды будет проверяться булевая переменная.


#5

И еще, по моему скромному опыту работы с многопоточностью могу сказать, что для прерывания потока нужно реализовывать корректный механизм завершения потока внутри этого самого потока. Не знаю есть ли в свифте механизм принудительного прерывания потока, но по опыту джавы, там есть такая возможность, но это не очень хороший тон программирования. Пусть меня поправят если я ошибаюсь.


#6

Я не очень вас понял, если вы просто хотите отменить действие, которое передано в очередь, можете использовать DispatchWorkItem

let item = DispatchWorkItem {
    print("Hello")
}

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5), execute: item)

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) {
    item.cancel()
}

Если вы хотите нажать на паузу, потом передумать, нажать обратно плей, чтобы продолжилась работа с места остановки, посмотрите в сторону таймера


#7

Спасибо за ответ уже нашёл способ!