Ios 正在从后台线程调用ARKit UIView SetAnimationEnabled

Ios 正在从后台线程调用ARKit UIView SetAnimationEnabled,ios,swift,arkit,Ios,Swift,Arkit,我有一个ARKit应用程序,可以显示图像。这些工作正常,但是如果我尝试使用来显示动画GIF,我会得到以下错误(如果需要,可以使用完整堆栈跟踪) 我找不到任何代码选择在后台线程上运行的地方。在我的代码中,addImage()可以正常工作,但是addGIF()会导致上述错误。myViewController.swift的相关部分包括: import UIKit import ARKit class ViewController: UIViewController, ARSCNViewDelegat

我有一个ARKit应用程序,可以显示图像。这些工作正常,但是如果我尝试使用来显示动画GIF,我会得到以下错误(如果需要,可以使用完整堆栈跟踪)

我找不到任何代码选择在后台线程上运行的地方。在我的代码中,
addImage()
可以正常工作,但是
addGIF()
会导致上述错误。my
ViewController.swift的相关部分包括:

import UIKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var planeDetected: UILabel!
    @IBOutlet weak var sceneView: ARSCNView!

    let configuration = ARWorldTrackingConfiguration()
    var portalDisplayed = false

    override func viewDidLoad() {
        super.viewDidLoad()
        self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
        self.configuration.planeDetection = .horizontal
        self.sceneView.session.run(configuration)
        self.sceneView.delegate = self
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        self.sceneView.addGestureRecognizer(tapGestureRecognizer)
    }

    @objc func handleTap(sender: UITapGestureRecognizer) {
        guard let sceneView = sender.view as? ARSCNView else {return}
        let touchLocation = sender.location(in: sceneView)
        let hitTestResult = sceneView.hitTest(touchLocation, types: .existingPlaneUsingExtent)
        if !hitTestResult.isEmpty {
            self.addPortal(hitTestResult: hitTestResult.first!)
        } else {
            //
        }
    }

    func addPortal(hitTestResult: ARHitTestResult) {
        self.portalDisplayed = true
        self.sceneView.debugOptions = []
        let portalScene = SCNScene(named: "Portal.scnassets/Portal.scn")
        let portalNode = portalScene!.rootNode.childNode(withName: "Portal", recursively: false)!
        let transform = hitTestResult.worldTransform
        let planeXposition = transform.columns.3.x
        let planeYposition = transform.columns.3.y
        let planeZposition = transform.columns.3.z
        portalNode.position = SCNVector3(planeXposition, planeYposition, planeZposition)
        self.sceneView.scene.rootNode.addChildNode(portalNode)

        ...

        // Using the commented line below instead means I don't get this error!
        // self.addImage(nodeName: "box", portalNode: portalNode, imageName: "image")
        self.addGIF(nodeName: "box", portalNode: portalNode, imageName: "image")
    }

    func addImage(nodeName: String, portalNode: SCNNode, imageName: String) {
        let child = portalNode.childNode(withName: nodeName, recursively: true)
        child?.geometry?.firstMaterial?.diffuse.contents = UIImage(named: "Portal.scnassets/\(imageName).jpg")
        child?.renderingOrder = 300
    }

    func addGIF(nodeName: String, portalNode: SCNNode, imageName: String) {
        let child = portalNode.childNode(withName: nodeName, recursively: true)
        let gifImage = UIImage.gifImageWithName("\(imageName)")
        let gifImageView = UIImageView(image: gifImage)
        child?.geometry?.firstMaterial?.diffuse.contents = gifImageView
    }

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard anchor is ARPlaneAnchor else {return}
        DispatchQueue.main.async {
            if self.portalDisplayed == false {
                self.planeDetected.isHidden = false
            }
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            self.planeDetected.isHidden = true
        }
    }

}

当调用上面链接中的代码时,有没有办法阻止这种情况发生?我也尝试了以下操作,但仍然出现相同的错误:

        DispatchQueue.main.async {
            self.addGIF(nodeName: "boxBW", portalNode: portalNode, imageName: "angel")
        }

我已经检查了提出的一些问题(例如),但它们似乎没有回答这个特定问题。

下面是代码作者建议的修复方法:下面是代码作者建议的修复方法:
        DispatchQueue.main.async {
            self.addGIF(nodeName: "boxBW", portalNode: portalNode, imageName: "angel")
        }