Az elsődleges szálat kell-e használni a folytatáshoz, miután egy aszinkron függvényt await-tal hívtunk meg a viewDidLoad módszerben indított feladatban?
sobes.tech MI
Válasz az MI-től
iOS-ben, ha egy aszinkron funkciót await-tel hívsz meg egy viewDidLoad-ban indított feladatban, fontos megérteni, hogy melyik szálon folytatódik a await utáni kód.
Alapértelmezés szerint, ha await-et használsz Task-en belül, prioritások vagy dispatcher-ek megadása nélkül, a folytatás bármelyik szálon megtörténhet, nem feltétlenül a fő szálon. Ez problémákat okozhat, ha UI-t frissítesz, mivel minden felület módosításának a fő szálon kell történnie.
Annak érdekében, hogy biztosan a fő szálon folytatódjon a kód await után, kifejezetten átállhatsz a fő dispatcher-re az await MainActor.run { ... } használatával vagy a metódus vagy osztály @MainActor-ral való megjelölésével.
Példa:
override func viewDidLoad() {
super.viewDidLoad()
Task {
let data = await fetchData()
await MainActor.run {
self.updateUI(with: data)
}
}
}
Így a folytatást a fő szálon kell végrehajtani, ha UI-val kell dolgozni egy aszinkron művelet után.