2017-06-19 9 views
0

上で実行されている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秒後、私はそれをもう実行したくないので、私はそれを止めたいと思う。

+0

ブロックを無効にすることができます。https://stackoverflow.com/a/25120393/2000162 – TomCobo

答えて

9

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() 
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 
関連する問題