Por que e como usar DispatchQueue.main.async ao trabalhar com Combine na sua aplicação?
sobes.tech IA
Resposta da IA
No Combine, os assinantes (subscribers) podem receber eventos em diferentes threads, dependendo de onde os dados são publicados. No entanto, a atualização da interface do utilizador no iOS deve ocorrer apenas no thread principal (main thread). Se tentar atualizar a interface a partir de uma thread em segundo plano, a aplicação pode comportar-se de forma incorreta ou até falhar.
O uso de DispatchQueue.main.async garante que o código dentro do bloco seja executado exatamente no thread principal. No contexto do Combine, isso é frequentemente necessário quando recebe dados em segundo plano e deseja atualizar a UI:
somePublisher
.receive(on: DispatchQueue.main) // ou
.sink { value in
DispatchQueue.main.async {
// atualização da UI
self.label.text = "\(value)"
}
}
.store(in: &cancellables)
Frequentemente, em vez de chamar explicitamente DispatchQueue.main.async, usa-se o operador .receive(on: DispatchQueue.main), que muda o thread de execução para os operadores e assinantes subsequentes.
Assim, DispatchQueue.main.async é necessário para atualizar a UI de forma segura a partir de fluxos do Combine, que podem estar a trabalhar em segundo plano.