Sobes.tech
Middle

Izskaidrojiet atšķirību starp escaping un non-escaping closures un kad ir nepieciešams izmantot @escaping.

sobes.tech AI

Atbilde no AI

Noklusējumi pēc noklusējuma ir non-escaping.

Non-escaping noklusējums:

  • Tiek izpildīts funkcijas ķermenī, kurai tas tiek nodots.
  • Noķer mainīgos, bet tos atbrīvo pēc funkcijas pabeigšanas.
  • Nepārdzīvo funkciju.
func doSomething(completion: () -> Void) {
    // Izsauciet completion šeit
    completion() 
}

Escaping noklusējums:

  • Tiek izpildīts pēc tam, kad funkcija, kurai tas tiek nodots, atgriežas.
  • Pārdzīvo funkcijas ķermeni.
  • To var saglabāt vēlākai izpildei, piemēram, citā pavedienā vai asinhroni.
  • Noķer mainīgos, saglabājot stipras saites, kas var novest pie stipriem saistību cikliem (retain cycles). Prasa skaidru @escaping deklarāciju.
class DataManager {
    var completionHandlers: [() -> Void] = []

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

    func performTasks() {
        // Veic uzdevumus...
        for handler in completionHandlers {
            handler() // Vēlāk izsauc
        }
    }
}

@escaping lietošana ir nepieciešama šādos gadījumos:

  • Kad aizvērums tiek saglabāts kā klases vai struktūras īpašums.
  • Kad aizvērums tiek nodots citam pavedienam vai asinhronai operācijai (piemēram, tīkla pieprasījumam, GCD, OperationQueue).
  • Kad aizvērums tiek izmantots kā notikumu apstrādātājs vai delegāts.