首页 > 解决方案 > 从 url 异步加载锚点不起作用

问题描述

使用 LoadAnchorAsync(contentsOf: URL) 加载锚点不起作用。这是我的代码:

if let url = url {
    let loadRequest = Entity.loadAnchorAsync(contentsOf: url)
    _ = loadRequest.sink(receiveCompletion: { completion in
        // handle completion
    }, receiveValue: { anchor in
        self.arView.scene.addAnchor(anchor)
    })
} else {
        fatalError("no url")
}

但这每次都会崩溃并出现错误:

线程 27:EXC_BREAKPOINT(代码=1,子代码=0x1051e0dfc)

在此处输入图像描述

更新:如果我将整个代码块包装在 DispatchQueue.main.async 块中,它不会崩溃,但不会调用 reveiceCompletion 或 recieveValue

标签: swiftaugmented-realityarkitcombinerealitykit

解决方案


您必须将订阅者存储在成员中的某个位置

// somewhere above
private var subscribers: Set<AnyCancellable>()

...
if let url = url {
    let loadRequest = Entity.loadAnchorAsync(contentsOf: url)
    loadRequest.sink(receiveCompletion: { completion in
        // handle completion
    }, receiveValue: { anchor in
        self.arView.scene.addAnchor(anchor)
    }).store(in: &self.subscribers) // << keep it alive
} else {
        fatalError("no url")
}

推荐阅读