Sobes.tech
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 @escaping deklaracijos.
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.