Sobes.tech
Junior — Middle

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.