Zašto je važno eksplicitno navesti anotaciju @escaping u funkcijama koje koriste asinhrone zatvaranja?
sobes.tech АИ
Одговор од АИ
U Swift-u, oznaka @escaping ukazuje da se zatvaranje (closure) može pozvati nakon što funkcija koja ga prima završi svoje izvršavanje. Ovo je važno za asinhrone operacije, gde se zatvaranje čuva i poziva kasnije, na primer, nakon završetka mrežnog zahteva.
Bez @escaping, kompajler pretpostavlja da se zatvaranje poziva sinhrono unutar funkcije i ne dozvoljava njegovo čuvanje za kasnije pozivanje, kako bi se izbegli potencijalni problemi sa upravljanjem memorijom i životnim ciklusom.
Primer:
func fetchData(completion: @escaping () -> Void) {
DispatchQueue.global().async {
// Asinhroni rad
completion() // pozivanje kasnije
}
}
Ovde je completion označeno kao @escaping jer se poziva nakon izlaska iz funkcije fetchData, na drugom thread-u.
Ako se ne navede @escaping u ovakvim slučajevima, kompajler će generisati grešku, jer se zatvaranje može pozvati kasnije, a bez ove anotacije Swift ne garantuje ispravno upravljanje memorijom i životnim ciklusom zatvaranja.