【问题标题】:GCD running background thread in spritekitGCD在spritekit中运行后台线程
【发布时间】: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


    【解决方案1】:

    你好 Nawab Hussaunnawab,问题不在于你在你的盒子里使用了 DispatchQueue,而是因为你把它放在了函数中:

    函数更新(_currentTime:TimeInterval){}

    此功能已在后台执行。按照苹果的定义,**每帧被系统调用一次**,速度非常快。这个函数永远不适合创建东西,它更像是一个吸气剂,你永远不应该定义任何东西,在你展示的这个例子中,你在起始位置添加了 10 个,它在每一帧中定义了这个数字,我相信你不想那样。所以这个函数会服务,例如:只获取盒子移动时的位置

    我希望它有所帮助,任何事情都可以调用!

    【讨论】:

    • 非常感谢您抽出宝贵时间帮助我。所以如果我不应该在更新函数中添加后台威胁,我应该在哪里添加我的后台线程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多