Published on

Swift-da escaping closures

Authors

Bu video sinxron va asinxron kod farqini, completion handler nima ekanini va @escaping qachon zarurligini tushuntiradi. Internet orqali ma'lumot yuklanadigan barcha funksiyalarda shu tushunchalar kerak.


Sinxron vs Asinxron

Sinxron kod β€” qatorma-qator, darhol bajariladi:

func downloadData() -> String {
    return "Yangi ma'lumot"  // darhol qaytaradi
}

let result = downloadData()  // natija shu zahoti keladi

Asinxron kod β€” natija biroz vaqtdan keyin keladi (internet, ma'lumotlar bazasi):

func downloadData2() -> String {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        return "Yangi ma'lumot"  // ❌ β€” bu ishlamaydi!
    }
}

return darhol qaytarishni kutadi, lekin ma'lumot 2 soniyadan keyin keladi. Shuning uchun oddiy return bu holat uchun mos emas.


Yechim β€” completion handler

return o'rniga funksiyaga boshqa funksiya parametr sifatida uzatiladi. Bu funksiya ma'lumot tayyor bo'lganda chaqiriladi:

func downloadData3(completionHandler: (_ data: String) -> Void) {
    completionHandler("Yangi ma'lumot")
}

// Chaqirish:
downloadData3 { data in
    self.text = data
}

completionHandler β€” parametr sifatida uzatilgan funksiya. U String qabul qiladi va hech narsa qaytarmaydi (Void).


@escaping β€” asinxron closure

Asinxron holatlarda (kechiktirilgan vazifa, tarmoq so'rovi) closure funksiya tugagandan keyin chaqiriladi. Bu "escape" β€” closure funksiya doirasidan "chiqib ketadi". Buning uchun @escaping kerak:

// ❌ @escaping yo'q β€” xato beradi
func downloadData3(completionHandler: (_ data: String) -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        completionHandler("Yangi ma'lumot")  // closure captures non-escaping parameter
    }
}

// βœ… @escaping bilan β€” to'g'ri
func downloadData3(completionHandler: @escaping (_ data: String) -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        completionHandler("Yangi ma'lumot")
    }
}

@escaping qo'shilganda self. talab qilinadi β€” bu kuchli referens yaratadi. weak self bilan yumshatiladi:

func getData() {
    downloadData3 { [weak self] data in
        self?.text = data
    }
}

Qadam-baqadam takomillashtirish

1. Oddiy completion

func downloadData3(completionHandler: @escaping (_ data: String) -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        completionHandler("Yangi ma'lumot")
    }
}

// Chaqirish:
downloadData3 { [weak self] data in
    self?.text = data
}

2. Model bilan β€” ko'p ma'lumot qaytarish uchun

Ko'p maydon qaytarish kerak bo'lsa, alohida struct yaratiladi:

struct DownloadResult {
    let data: String
}

func downloadData4(completionHandler: @escaping (_ result: DownloadResult) -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        let result = DownloadResult(data: "Yangi ma'lumot")
        completionHandler(result)
    }
}

// Chaqirish:
downloadData4 { [weak self] result in
    self?.text = result.data
}

3. typealias bilan β€” eng toza yozuv

struct DownloadResult {
    let data: String
}

typealias DownloadCompletion = (DownloadResult) -> Void

func downloadData5(completionHandler: @escaping DownloadCompletion) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        let result = DownloadResult(data: "Yangi ma'lumot")
        completionHandler(result)
    }
}

// Chaqirish:
downloadData5 { [weak self] result in
    self?.text = result.data
}

typealias DownloadCompletion = (DownloadResult) -> Void β€” uzun tur nomini qisqaroq nom bilan almashtiradi. Katta loyihalarda o'qilishni yaxshilaydi.


Taqqoslash jadvali

VersiyaYondashuvQachon ishlatiladi
return StringSinxron, darholTarmoq yo'q, natija tezkor
(_ data: String) -> VoidOddiy closureAsinxron, bitta qiymat
(_ result: Model) -> VoidModel bilanKo'p qiymat qaytarish
typealias CompletionToza yozuvKo'p joyda qayta ishlatish

Xulosa

Bu videoda o'rganildi:

  • Sinxron β€” natija darhol keladi, oddiy return
  • Asinxron β€” natija vaqt o'tgach keladi, return ishlamaydi
  • Completion handler β€” natija kelganda chaqiriladigan funksiya-parametr
  • @escaping β€” closure funksiya doirasidan chiqib ketganda kerak (tarmoq, kechikish)
  • [weak self] β€” kuchli referens oldini olish
  • Model β€” ko'p qiymat qaytarish uchun struct yaratish
  • typealias β€” completion turini qisqa nom bilan almashtirish

Keyingi videolarda shu tushunchalar tarmoqdan haqiqiy ma'lumot yuklashda ishlatiladi.


Keyingi videoda haqiqiy internet so'rovi va ma'lumot yuklash ko'rsatiladi.

Buy mea coffee