从URL异步加载锚点无法工作

3
使用 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(code=1,subcode=0x1051e0dfc)

enter image description here

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

2个回答

2

你需要将订阅者存储在成员变量中

// 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")
}

0

试试这个

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

Entity.load(contentsOf: url) 不返回 LoadRequest,因为它不是异步的。 - Magnus T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接