Sobes.tech
Junior — Middle

Kas peaks kasutama peamist lõngat, et jätkata pärast asünkroonse funktsiooni kutsumist koos await-iga ülesandes, mis on käivitatud viewDidLoad meetodis?

sobes.tech AI

Vastus AI-lt

iOS-is, kui kutsute asünkroonse funktsiooni await-ga ülesande sees, mis on käivitatud viewDidLoad-is, on oluline mõista, millisel niidil jätkub pärast await.

Vaikimisi, kui kasutate await Task-i sees ilma prioriteete või dispatcher-ite määramiseta, võib jätk toimuda mis tahes niidil, mitte tingimata peamisel niidil. See võib põhjustada probleeme, kui uuendate UI-d, kuna kõik kasutajaliidese muudatused peavad toimuma peamisel niidil.

Selleks, et tagada, et pärast await jätkub kood peamisel niidil, saate selgelt üle minna peamise dispatcher-ile, kasutades await MainActor.run { ... } või märgistades meetodi või klassi @MainActor-ga.

Näide:

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

Seega, peate jätkama peamisel niidil, kui peate töötama UI-ga pärast asünkroonset operatsiooni.