Sobes.tech
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).
  • Када се затварање користи као обработник догађаја или делегат.