【问题标题】:Stop a DispatchQueue that is running on the main thread停止在主线程上运行的 DispatchQueue
【发布时间】:2017-11-21 20:33:46
【问题描述】:

我有这段代码:

    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 秒后,我决定不再执行它,所以我想停止它。

【问题讨论】:

标签: swift grand-central-dispatch dispatch-queue


【解决方案1】:

您可以使用DispatchWorkItems。它们可以安排在DispatchQueues 上,并在执行前取消。

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()

【讨论】:

    【解决方案2】:

    您可以使用一次性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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多