Остановить DispatchQueue, работающий в основном потоке

У меня есть этот блок кода:

    DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(isDelayAccounted.hashValue)) + extraDelay) {
        self.isShootingOnHold = false
        self.shoot()
        self.shootingEngine = Timer.scheduledTimer(timeInterval: (Double(60)/Double(self.ratePerMinute)), target: self, selector: #selector(ShootingEnemy.shoot), userInfo: nil, repeats: true)   
    }

Теперь я хочу иметь возможность остановить выполнение этого потока. Как я могу остановить его выполнение? Например, через 3 секунды я решаю, что больше не хочу, чтобы это выполнялось, поэтому хочу его остановить.


person Pablo    schedule 19.06.2017    source источник
comment
Вы можете сделать блок недействительным stackoverflow.com/a/25120393/2000162   -  person TomCobo    schedule 19.06.2017


Ответы (2)


Вы можете использовать DispatchWorkItems. Их можно запланировать на DispatchQueueсек и отменить перед их выполнением.

let work = DispatchWorkItem(block: {
    self.isShootingOnHold = false
    self.shoot()
    self.shootingEngine = Timer.scheduledTimer(timeInterval: (Double(60)/Double(self.ratePerMinute)), target: self, selector: #selector(ShootingEnemy.shoot), userInfo: nil, repeats: true)
})
DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(isDelayAccounted.hashValue)) + extraDelay, execute: work)
work.cancel()
person Dávid Pásztor    schedule 19.06.2017

Вы можете использовать одноразовый DispatchSourceTimer, а не asyncAfter

var oneShot : DispatchSourceTimer!

 oneShot = DispatchSource.makeTimerSource(queue: DispatchQueue.main)
 oneShot.scheduleOneshot(deadline: .now() + (delay * Double(isDelayAccounted.hashValue)) + extraDelay))
 oneShot.setEventHandler {
     self.isShootingOnHold = false
     self.shoot()
     self.shootingEngine = Timer.scheduledTimer(timeInterval: (Double(60)/Double(self.ratePerMinute)), target: self, selector: #selector(ShootingEnemy.shoot), userInfo: nil, repeats: true)   
 }
 oneShot.setCancelHandler {
     // do something after cancellation
 }

 oneShot.resume()

и отменить выполнение с помощью

oneShot?.cancel()
oneShot = nil
person vadian    schedule 19.06.2017