1
resposta

Warning Publishing changes from background threads is not allowed

Uma dúvida sobre o projeto. Ao rodar o app, desde o projeto passado ele da o seguinte warning quando alteramos o valor de um atributo published no ViewMode:

Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

Pesquisando por cima, achei que uma alternativa era colocar a notation @MainActor tanto na classe do ViewModel, quanto na classe do teste. Pelo que entendi esse notation ele sinaliza para o sistema que aquele código será utilizado na thread principal do app, assim evitando bugs. Isso é correto? Qual seria a melhor alternativa relacionado a isso?

1 resposta

Olá, Pedro! Tudo bem?

A mensagem de warning que você está recebendo, "Publishing changes from background threads is not allowed," ocorre porque o SwiftUI e o Combine esperam que as atualizações de interface sejam feitas na thread principal. Isso é importante para garantir que a interface do usuário seja atualizada de maneira segura e responsiva.

Você está no caminho certo ao considerar o uso da anotação @MainActor. Essa anotação informa ao compilador que o código dentro da classe ou do método deve ser executado na thread principal. Isso pode ajudar a evitar o warning que você está enfrentando.

Aqui está um exemplo de como você poderia aplicar isso:

@MainActor
class SearchStoreViewModel: ObservableObject {
    // Sua implementação
}

Ou, se preferir aplicar apenas a métodos específicos:

class SearchStoreViewModel: ObservableObject {
    @MainActor
    func fetchData() {
        // Sua implementação
    }
}

No entanto, é importante testar e verificar se essa abordagem resolve o problema no seu caso específico. Além disso, ao usar @MainActor, você deve garantir que qualquer chamada para métodos assíncronos que atualizem propriedades publicadas também respeitem essa anotação.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.