Middle
Paaiškinkite skirtumą tarp escaping ir non-escaping closures ir kada būtina naudoti @escaping.
sobes.tech AI
Atsakymas iš AI
Numatytie uždarymai nėra escape.
Ne-escape uždarymas:
- Vykdomas funkcijos kūne, kuriai jis perduodamas.
- Užfiksuoja kintamuosius, bet juos atlaisvina po funkcijos pabaigos.
- Nepergyvena funkcijos.
func doSomething(completion: () -> Void) {
// Kviečiame completion čia
completion()
}
Escape uždarymas:
- Vykdomas po to, kai funkcija, kuriai jis perduodamas, grįžta.
- Pergyvena funkcijos kūną.
- Gali būti išsaugotas vėlesniam vykdymui, pvz., kitame sraute ar asinchroniškai.
- Užfiksuoja kintamuosius, išlaiko stiprias nuorodas, kas gali sukelti stiprių nuorodų ciklus (retain cycles). Reikalauja aiškios
@escapingdeklaracijos.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Atlieka užduotis...
for handler in completionHandlers {
handler() // Vėlesnis iškvietimas
}
}
}
@escaping naudojimas yra būtinas šiais atvejais:
- Kai uždarymas yra saugomas kaip klasės ar struktūros savybė.
- Kai uždarymas perduodamas į kitą srautą ar asinchroninę operaciją (pvz., tinklo užklausa, GCD, OperationQueue).
- Kai uždarymas naudojamas kaip įvykio tvarkytojas ar delegatas.