- Published on
Swift-da escaping closures
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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
| Versiya | Yondashuv | Qachon ishlatiladi |
|---|---|---|
return String | Sinxron, darhol | Tarmoq yo'q, natija tezkor |
(_ data: String) -> Void | Oddiy closure | Asinxron, bitta qiymat |
(_ result: Model) -> Void | Model bilan | Ko'p qiymat qaytarish |
typealias Completion | Toza yozuv | Ko'p joyda qayta ishlatish |
Xulosa
Bu videoda o'rganildi:
- Sinxron β natija darhol keladi, oddiy
return - Asinxron β natija vaqt o'tgach keladi,
returnishlamaydi - 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.