Sobes.tech
Junior — Middle

Ar reikia naudoti pagrindinį srautą, kad tęsti po to, kai iškviečiama asinchroninė funkcija su await viduje užduoties, pradėtos viewDidLoad metode?

sobes.tech AI

Atsakymas iš AI

iOS, jei kviečiate asinchroninę funkciją su await viduje užduoties, pradėtos viewDidLoad, svarbu suprasti, kuriame sraute tęsis po await.

Pagal numatytuosius nustatymus, jei naudojate await Task viduje be prioritetų ar dispatcher'ių nurodymo, tęsinys gali įvykti bet kuriame sraute, ne būtinai pagrindiniame. Tai gali sukelti problemų, jei atnaujinate UI, nes visi sąsajos pakeitimai turi būti vykdomi pagrindiniame sraute.

Kad užtikrintumėte, jog po await kodas tęsis pagrindiniame sraute, galite aiškiai pereiti į pagrindinį dispatcher'į naudodami await MainActor.run { ... } arba naudodami @MainActor metodui ar klasei.

Pavyzdys:

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

Taip, tęsinį reikėtų vykdyti pagrindiniame sraute, jei reikia dirbti su UI po asinchroninės operacijos.