我有一个爆炸盒子的连锁反应,我想让周围的环境不会下降,直到反应结束,所以我有一个变量,每当一个盒子开始爆炸时会增加,当它完成时会减少爆炸。它适用于小反应,但大型反应永远不会将计数器返回0,这使我怀疑同步问题。然而,我尝试同步它没有做任何事情。我做错了什么?
全球锁定方法:
func lock(handle: AnyObject, body : () -> ()) {
objc_sync_enter(handle)
body()
objc_sync_exit(handle)
}
爆炸的本地方法:
func explode(x: Int) {
currently_exploding++
switch type {
case 0:
self.runAction(self.die, completion: { () -> Void in
lock(currently_exploding) {
currently_exploding--
}
})
break;
case 1:
self.runAction(self.die, completion: { () -> Void in
lock(currently_exploding) {
let i = self.i
let j = self.j
if j < 9 {
board[i][j+1]?.explode(x+1)
}
if i < 4 {
board[i+1][j]?.explode(x+1)
}
if j > 0 {
board[i][j-1]?.explode(x+1)
}
if i > 0 {
board[i-1][j]?.explode(x+1)
}
currently_exploding--
}
})
break;
default:
println("got to default")
break;
}
}
通过在其中一个方框上调用explode(1)开始反应。 x的值只是跟踪链的深度,与我试图同步的变量无关。