在将选定图像放在地板上的 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")
}
}
}
如有任何帮助,我们将不胜感激。
由于
loadMainScene()
静态函数被标记为 @MainActor
注解,这意味着该函数将在主线程上执行。因此,您还需要在 init 函数中添加@MainActor。
@MainActor
init(vm: FurnitureViewModel) {
...
}