Stop a DispatchQueue that is running on the main thread

后端 未结 2 732
既然无缘
既然无缘 2020-12-10 15:53

I have this block of code:

    DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(isDelayAccounted.hashValue)) + extraDelay) {
        self.isS         


        
相关标签:
2条回答
  • 2020-12-10 16:38

    You can use DispatchWorkItems. They can be scheduled on DispatchQueues and cancelled before their execution.

    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()
    
    0 讨论(0)
  • 2020-12-10 16:45

    You could use an one-shot DispatchSourceTimer rather than 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()
    

    and cancel the execution with

    oneShot?.cancel()
    oneShot = nil
    
    0 讨论(0)
提交回复
热议问题