【发布时间】:2019-04-07 03:32:36
【问题描述】:
这是我遇到的错误,请查看附件图片了解更多信息。
com.apple.scenekit.scnview-renderer (17):EXC_BAD_ACCESS(代码=1,地址=0xf000000010a10c10)
我可以在调用以下函数时重现此错误,但前提是该函数在一秒钟内被多次调用。如果用户快速点击按钮以循环到下一辆可用的汽车,就会发生这种情况。
如您所见,我尝试将其包装在 DispatchQueue 中以解决我的问题。
您还会注意到,我创建了一个 Bool alreadyCyclingCars 来跟踪 cycleCarNext() 函数是否在允许再次调用之前完成。
这个函数本质上是遍历unlockedCars数组中的所有unlockedCars。
如果汽车的类型与我们当前正在寻找的匹配,我将打破循环。
然后我们确定当前车的索引,看看我需要显示的下一辆车是否是数组中的下一辆(如果有的话)如果不是,我们已经到了数组的末尾所以我显示数组中的第一辆车。
有没有人比我更了解这件事? 非常感谢!
func cycleCarNext() {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if !self.alreadyCyclingCars {
self.alreadyCyclingCars = true
var indexOfCurrentCar = 0
for (index, car) in UserData.shared.unlockedCars.enumerated() {
if car.type == self.overlayScene.currentCarOnDisplay {
indexOfCurrentCar = index
break
}
}
if indexOfCurrentCar < UserData.shared.unlockedCars.count - 1 {
let nextCar = UserData.shared.unlockedCars[indexOfCurrentCar+1]
self.playerNode.removeFromParentNode()
self.playerNode = nextCar
self.playerNode.name = "player"
self.playerNode.position = SCNVector3(x: 17, y: 0.3, z: 0)
self.playerNode.eulerAngles = SCNVector3(x: 0, y: toRadians(angle: 45),z: 0)
self.scene.rootNode.addChildNode(self.playerNode)
self.overlayScene.currentCarOnDisplay = nextCar.type
self.overlayScene.updateGarageInterface()
} else {
guard let nextCar = UserData.shared.unlockedCars.first else { return }
self.playerNode.removeFromParentNode()
self.playerNode = nextCar
self.playerNode.name = "player"
self.playerNode.position = SCNVector3(x: 17, y: 0.3, z: 0)
self.playerNode.eulerAngles = SCNVector3(x: 0, y: toRadians(angle: 45),z: 0)
self.scene.rootNode.addChildNode(self.playerNode)
self.overlayScene.currentCarOnDisplay = nextCar.type
self.overlayScene.updateGarageInterface()
}
self.alreadyCyclingCars = false
}
}
}
【问题讨论】:
-
@RX9 谢谢先生!