Middle
Selgitage erinevust escaping ja non-escaping closures ning millal on vaja kasutada @escaping.
sobes.tech AI
Vastus AI-lt
Vaikimisi sulgemised on mitte-escape.
Mitte-escape sulgemine:
- Töötab funktsiooni kehas, millele see antakse.
- Hõlmab muutujad, kuid vabastab need pärast funktsiooni lõppu.
- Ei jää ellu funktsiooni.
func doSomething(completion: () -> Void) {
// Kutsume completion siin
completion()
}
Escape sulgemine:
- Töötab pärast funktsiooni tagasipöördumist, millele see antakse.
- Jääb ellu funktsiooni kehas.
- Võib salvestada hilisemaks täitmiseks, näiteks teises lõimes või asünkroonselt.
- Hõlmab muutujad, hoides tugevad viited, mis võib viia tugevate viidetsükliteni (retain cycles). Nõuab selget
@escapingdeklaratsiooni.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Tööde teostamine...
for handler in completionHandlers {
handler() // Hiljem kutsutakse
}
}
}
@escaping kasutamine on vajalik järgmistes olukordades:
- Kui sulgemine salvestatakse klassi või struktuuri omadusena.
- Kui sulgemine antakse teisele lõngale või asünkroonsele operatsioonile (näiteks võrgupäring, GCD, OperationQueue).
- Kui sulgemist kasutatakse sündmuse töötlejana või delegaadina.