Загрузка якоря из асинхронного 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, ни reciveValue не будут вызваны.


person Magnus T    schedule 05.02.2020    source источник


Ответы (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")
}
person Asperi    schedule 06.02.2020

Попробуй это

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")
}
person deepak    schedule 05.02.2020
comment
Entity.load(contentsOf: url) не возвращает LoadRequest, потому что он не асинхронный - person Magnus T; 05.02.2020