Sobes.tech
Junior — Middle

Da li treba koristiti glavni tok za nastavak nakon poziva asinhrone funkcije sa await unutar zadatka pokrenutog u metodi viewDidLoad?

sobes.tech АИ

Одговор од АИ

U iOS-u, ako pozivate asinhronu funkciju sa await unutar zadatka pokrenutog u viewDidLoad, važno je razumeti na kojem thread-u će se nastaviti nakon await.

Podrazumevano, ako koristite await unutar Task bez specificiranja prioriteta ili dispatcher-a, nastavak može da se dogodi na bilo kom thread-u, ne nužno na glavnom thread-u. To može izazvati probleme ako ažurirate UI, jer sve promene interfejsa moraju da se obavljaju na glavnom thread-u.

Da biste osigurali da nakon await kod nastavi na glavnom thread-u, možete eksplicitno prebaciti na glavni dispatcher pomoću await MainActor.run { ... } ili koristiti @MainActor za metodu ili klasu.

Primer:

override func viewDidLoad() {
    super.viewDidLoad()
    Task {
        let data = await fetchData()
        await MainActor.run {
            self.updateUI(with: data)
        }
    }
}

Na ovaj način, treba koristiti glavni thread za nastavak ako je potrebno raditi sa UI-jem nakon asinhrone operacije.