“só pode ser chamado a partir do thread principal”
Quando você surge com o erro, é principalmente porque a função que lida com a interface do usuário não foi chamada a partir do thread principal.
Deve ser chamado a partir do tópico principal como segue
DispatchQueue.main.async(execute: {
// call any function ex. doSomething()
self.doSomething()
})