Sobes.tech
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.