【发布时间】:2021-05-07 19:45:17
【问题描述】:
当我运行一个使用“self”来查找具有特定名称的变量的后台线程时,我遇到了这个问题。该项目崩溃并说我无法对我搜索的“NSArray”进行任何枚举,并发现这是场景中所有无法编辑的对象的列表。所以我做了这个虚拟项目,以简单的方式展示我的问题。
代码如下:
import SpriteKit
import Foundation
class GameScene: SKScene{
override func sceneDidLoad() {
}
var boxArray = [String]()
var boxNumber = 1
func addBox(){
var box = SKSpriteNode()
box.size = CGSize(width: 100, height: 100)
box.color = SKColor.red
box.position = CGPoint(x: 0, y: 0)
box.name = "box\(boxNumber)"
self.addChild(box)
boxArray.append(box.name!)
boxNumber += 1
}
func moveBox(){
for i in boxArray{
if self.childNode(withName: "\(i)") != nil{
var box = self.childNode(withName: "\(i)") as! SKSpriteNode
box.position.x += 10
}
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
addBox()
}
override func update(_ currentTime: TimeInterval) {
DispatchQueue.global(qos: .background).async {
self.moveBox()
}
}
}
这是崩溃报告
2021-05-07 20:06:12.568267+0200 线程[99375:16974860] 启用金属 GPU 帧捕获 2021-05-07 20:06:12.568677+0200 线程[99375:16974860] 启用金属 API 验证 苹果手机 2021-05-07 20:06:18.951497+0200 threading[99375:16975092] *** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“*** Collection <__nsarraym:> 在枚举时发生了突变。” *** 首先抛出调用堆栈: (0x18d09d9d8 0x1a1406b54 0x18d09d39c 0x1bf463c90 0x1bf463480 0x1bf462ecc 0x1bf462e10 0x102fcc50c 0x102fcca08 0x102fcca4c 0x103733ce4 0x103735528 0x1037471e4 0x103747970 0x1d5743568 0x1d5746874) 2021-05-07 20:06:18.954714+0200 threading[99375:16975088] *** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“*** Collection <__nsarraym:> 在枚举时发生了突变。” *** 首先抛出调用堆栈: (0x18d09d9d8 0x1a1406b54 0x18d09d39c 0x1bf463c90 0x1bf463480 0x1bf462ecc 0x1bf462e10 0x102fcc380 0x102fcca08 0x102fcca4c 0x103733ce4 0x103735528 0x1037471e4 0x103747970 0x1d5743568 0x1d5746874) libc++abi.dylib:以 NSException 类型的未捕获异常终止 *** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“*** Collection <__nsarraym:> 在枚举时发生了变异。”
所以“moveBox”函数正在后台线程中运行,一切正常,并且可以正常工作。但是通过创建一个新的 SKSpritenode 我将通过插入一个新元素对 NSArray 进行更改,因此应用程序崩溃了。
所以我的问题是如何创建一个新的 SKSpriteNode,使用后台线程并同时从“self”调用一个节点而不会导致应用程序崩溃? 感谢我能得到的所有帮助。
【问题讨论】:
标签: swift xcode multithreading grand-central-dispatch