Middle
Vysvetlite rozdiel medzi escaping a non-escaping closures a kedy je potrebné použiť @escaping.
sobes.tech AI
Odpoveď od AI
Predvolené uzávierky sú non-escaping.
Non-escaping uzávierka:
- Vykonáva sa v tele funkcie, ktorej je odovzdaná.
- Zachytáva premenné, ale ich uvoľňuje po dokončení funkcie.
- Neprežije funkciu.
func doSomething(completion: () -> Void) {
// Volanie completion tu
completion()
}
Escaping uzávierka:
- Vykonáva sa po návrate z funkcie, ktorej je odovzdaná.
- Prežíva telo funkcie.
- Môže byť uložená na neskoršie vykonanie, napríklad v inom vlákne alebo asynchrónne.
- Zachytáva premenné, udržiavajúce silné odkazy, čo môže viesť k cyklom silných odkazov (retain cycles). Vyžaduje explicitnú deklaráciu
@escaping.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Vykonávanie úloh...
for handler in completionHandlers {
handler() // Neskoré volanie
}
}
}
Použitie @escaping je potrebné v týchto prípadoch:
- Keď je uzávierka uložená ako vlastnosť triedy alebo štruktúry.
- Keď je uzávierka odovzdaná do iného vlákna alebo asynchrónnej operácie (napríklad sieťový požiadavok, GCD, OperationQueue).
- Keď je uzávierka použitá ako spracovateľ udalostí alebo delegát.