Middle
Izskaidrojiet atšķirību starp escaping un non-escaping closures un kad ir nepieciešams izmantot @escaping.
sobes.tech AI
Atbilde no AI
Noklusējumi pēc noklusējuma ir non-escaping.
Non-escaping noklusējums:
- Tiek izpildīts funkcijas ķermenī, kurai tas tiek nodots.
- Noķer mainīgos, bet tos atbrīvo pēc funkcijas pabeigšanas.
- Nepārdzīvo funkciju.
func doSomething(completion: () -> Void) {
// Izsauciet completion šeit
completion()
}
Escaping noklusējums:
- Tiek izpildīts pēc tam, kad funkcija, kurai tas tiek nodots, atgriežas.
- Pārdzīvo funkcijas ķermeni.
- To var saglabāt vēlākai izpildei, piemēram, citā pavedienā vai asinhroni.
- Noķer mainīgos, saglabājot stipras saites, kas var novest pie stipriem saistību cikliem (retain cycles). Prasa skaidru
@escapingdeklarāciju.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Veic uzdevumus...
for handler in completionHandlers {
handler() // Vēlāk izsauc
}
}
}
@escaping lietošana ir nepieciešama šādos gadījumos:
- Kad aizvērums tiek saglabāts kā klases vai struktūras īpašums.
- Kad aizvērums tiek nodots citam pavedienam vai asinhronai operācijai (piemēram, tīkla pieprasījumam, GCD, OperationQueue).
- Kad aizvērums tiek izmantots kā notikumu apstrādātājs vai delegāts.