Middle
Objasnite razliku između escaping i non-escaping closures i u kojim slučajevima je potrebno koristiti @escaping.
sobes.tech АИ
Одговор од АИ
Затварање по подразумевану вредност су non-escaping.
Non-escaping затварање:
- Извршава се у телу функције којој се преноси.
- Хвата променљиве, али их ослобађа након што функција заврши.
- Не преживљава функцију.
func doSomething(completion: () -> Void) {
// Позив completion овде
completion()
}
Escaping затварање:
- Извршава се након што функција којој се преноси се врати.
- Преживљава тело функције.
- Може бити сачувано за касније извршавање, на пример, у другом току или асинхроно.
- Хвата променљиве, одржавајући јаке референце, што може довести до циклуса јаких референци (retain cycles). Захтева јасну декларацију
@escaping.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Извршавање задатака...
for handler in completionHandlers {
handler() // Позиви handlerе касније
}
}
}
Користите @escaping у следећим случајевима:
- Када се затварање чува као својство класе или структуре.
- Када се затварање преноси у други тред или асинхрона операција (нпр. мрежни захтев, GCD, OperationQueue).
- Када се затварање користи као обработник догађаја или делегат.