在 ARKit swiftui 应用程序中的同步非隔离上下文错误中调用主参与者隔离的静态方法“loadMainScene()”

问题描述 投票:0回答:1

在将选定图像放在地板上的 swiftui ARKit 应用程序中,我收到错误 Call to main actor-isolated static method 'loadMainScene()' in a synchronous nonisolated context at line self.mainScene = try! Experience.loadMainScene() 。如何解决上述错误?

import Foundation
import RealityKit
import ARKit 


class Coordinator {
    
    var arView: ARView?
    var mainScene: Experience.MainScene
    var vm: FurnitureViewModel
    
    init(vm: FurnitureViewModel) {
        self.vm = vm
        self.mainScene = try! Experience.loadMainScene()
    }
    
    @objc func tapped(_ recognizer: UITapGestureRecognizer) {
        
        guard let arView = arView else {
            return
        }
        
        let location = recognizer.location(in: arView)
        let results = arView.raycast(from: location, allowing: .estimatedPlane, alignment: .horizontal)
        
        if let result = results.first {
            
            let anchor = AnchorEntity(raycastResult: result)
            guard let entity = mainScene.findEntity(named: vm.selectedFurniture) else {
                return
            }
            entity.position = SIMD3(0,0,0)
            
            anchor.addChild(entity)
            arView.scene.addAnchor(anchor)
        }
        
    }
    
}

// // 经验.swift // 生成的内容。请勿编辑。 //

进口粉底 导入RealityKit 导入SIMD 导入组合

@可用(iOS 13.0、macOS 10.15、*) 公共枚举经验 {

public enum LoadRealityFileError: Error {
    case fileNotFound(String)
}

@MainActor
private static var streams = [Combine.AnyCancellable]()

@MainActor
public static func loadMainScene() throws -> Experience.MainScene {
    guard let realityFileURL = Foundation.Bundle(for: Experience.MainScene.self).url(forResource: "Experience", withExtension: "reality") else {
        throw Experience.LoadRealityFileError.fileNotFound("Experience.reality")
    }

    let realityFileSceneURL = realityFileURL.appendingPathComponent("MainScene", isDirectory: false)
    let anchorEntity = try Experience.MainScene.loadAnchor(contentsOf: realityFileSceneURL)
    return createMainScene(from: anchorEntity)
}

@MainActor
public static func loadMainSceneAsync(completion: @escaping (Swift.Result<Experience.MainScene, Swift.Error>) -> Void) {
    guard let realityFileURL = Foundation.Bundle(for: Experience.MainScene.self).url(forResource: "Experience", withExtension: "reality") else {
        completion(.failure(Experience.LoadRealityFileError.fileNotFound("Experience.reality")))
        return
    }

    var cancellable: Combine.AnyCancellable?
    let realityFileSceneURL = realityFileURL.appendingPathComponent("MainScene", isDirectory: false)
    let loadRequest = Experience.MainScene.loadAnchorAsync(contentsOf: realityFileSceneURL)
    cancellable = loadRequest.sink(receiveCompletion: { loadCompletion in
        if case let .failure(error) = loadCompletion {
            completion(.failure(error))
        }
        streams.removeAll { $0 === cancellable }
    }, receiveValue: { entity in
        completion(.success(Experience.createMainScene(from: entity)))
    })
    cancellable?.store(in: &streams)
}

@MainActor
private static func createMainScene(from anchorEntity: RealityKit.AnchorEntity) -> Experience.MainScene {
    let mainScene = Experience.MainScene()
    mainScene.anchoring = anchorEntity.anchoring
    mainScene.addChild(anchorEntity)
    return mainScene
}

public class MainScene: RealityKit.Entity, RealityKit.HasAnchoring {

    public var armoire: RealityKit.Entity? {
        return self.findEntity(named: "armoire")
    }



    public var chair: RealityKit.Entity? {
        return self.findEntity(named: "chair")
    }



    public var sofa: RealityKit.Entity? {
        return self.findEntity(named: "sofa")
    }



    public var table: RealityKit.Entity? {
        return self.findEntity(named: "table")
    }



}

}

如有任何帮助,我们将不胜感激。

swift swiftui augmented-reality arkit
1个回答
0
投票

由于

loadMainScene()
静态函数被标记为
@MainActor
注解,这意味着该函数将在主线程上执行。因此,您还需要在 init 函数中添加@MainActor。

@MainActor
init(vm: FurnitureViewModel) {
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.