停止在主线程上运行的DispatchQueue

21

I have this block of code:

    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秒后,我决定不再让它继续执行,因此我想要停止它。


你可以使该块失效 https://dev59.com/gGAg5IYBdhLWcg3wDHQ3#25120393 - TomCobo
2个回答

56

您可以使用DispatchWorkItem。它们可以在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()

12
你可以使用一次性的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接