Sobes.tech
Middle

Selgitage erinevust escaping ja non-escaping closures ning millal on vaja kasutada @escaping.

sobes.tech AI

Vastus AI-lt

Vaikimisi sulgemised on mitte-escape.

Mitte-escape sulgemine:

  • Töötab funktsiooni kehas, millele see antakse.
  • Hõlmab muutujad, kuid vabastab need pärast funktsiooni lõppu.
  • Ei jää ellu funktsiooni.
func doSomething(completion: () -> Void) {
    // Kutsume completion siin
    completion() 
}

Escape sulgemine:

  • Töötab pärast funktsiooni tagasipöördumist, millele see antakse.
  • Jääb ellu funktsiooni kehas.
  • Võib salvestada hilisemaks täitmiseks, näiteks teises lõimes või asünkroonselt.
  • Hõlmab muutujad, hoides tugevad viited, mis võib viia tugevate viidetsükliteni (retain cycles). Nõuab selget @escaping deklaratsiooni.
class DataManager {
    var completionHandlers: [() -> Void] = []

    func addCompletionHandler(handler: @escaping () -> Void) {
        completionHandlers.append(handler)
    }

    func performTasks() {
        // Tööde teostamine...
        for handler in completionHandlers {
            handler() // Hiljem kutsutakse
        }
    }
}

@escaping kasutamine on vajalik järgmistes olukordades:

  • Kui sulgemine salvestatakse klassi või struktuuri omadusena.
  • Kui sulgemine antakse teisele lõngale või asünkroonsele operatsioonile (näiteks võrgupäring, GCD, OperationQueue).
  • Kui sulgemist kasutatakse sündmuse töötlejana või delegaadina.