- Published on
URLSession va async/await bilan ma'lumot olish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Mental modelingiz tayyor β endi kodni yozish vaqti. Internetdan ma'lumot olish zamonaviy Swift da ikkita narsani birlashtiradi: URLSession (Apple ning tarmoq qatlami) va async/await (vaqt talab qiladigan vazifalarni boshqarish usuli).
async/await nima?
Ba'zi operatsiyalar vaqt talab qiladi β serverdan ma'lumot olish kabi. Ilovangiz javob kutayotganda butunlay muzlab qolishini xohlamaysiz. Bu juda yomon tajriba bo'lar edi.
async/await sizga: "Bu vazifani boshlang va u tugashini kutayotganda ilova ishlashda davom etsin" deyish imkonini beradi. await kalit so'zi kutish bo'ladigan nuqtani belgilaydi β kodingiz o'sha satrda to'xtaydi, natija kelgach esa davom etadi.
SwiftUI da .task modifikatori asinxron tarmoq so'rovini boshlashning eng qulay usuli. Ko'rinish yo'qolsa, vazifani avtomatik bekor qiladi.
| Qator | Vazifasi |
|---|---|
struct Post: Codable, Identifiable | Ma'lumot modelini belgilaydi. Codable β JSON dekodlash uchun, Identifiable β List da noyob identifikatsiya uchun |
.task { await fetchPosts() } | Ko'rinish paydo bo'lganda asinxron vazifani boshlaydi, yo'qolsa bekor qiladi |
guard let url = URL(string: ...) else { return } | URL(string:) ixtiyoriy qaytaradi β noto'g'ri URL da erta chiqish |
try await URLSession.shared.data(from: url) | GET so'rov qiladi, data va response qaytadi. await β javob kutiladi |
JSONDecoder().decode([Post].self, from: data) | Xom Data ni Post massiviga aylantiradi |
await MainActor.run { posts = decoded } | State o'zgarishini asosiy oqimda bajaradi β UI yangilanishi xavfsiz |
Muhim patternlar
// do/catch β xatolarni ushlash
do {
let (data, _) = try await URLSession.shared.data(from: url)
// data dan foydalaning
} catch {
print("Xato: \(error)")
}
// URL xavfsiz yaratish
guard let url = URL(string: "https://api.example.com/data") else {
print("Noto'g'ri URL")
return
}
// UI ni asosiy oqimda yangilash
await MainActor.run {
self.items = decoded
}
Tezkor ma'lumotnoma
| Sintaksis | Vazifasi |
|---|---|
func load() async | Await bilan chaqirilishi kerak bo'lgan asinxron funksiya |
await someAsyncFunction() | Asinxron funksiyani chaqiradi, natija kelguncha to'xtaydi |
try await URLSession.shared.data(from: url) | GET so'rov qiladi va xom data qaytaradi |
let (data, _) = try await ... | Kortejni ajratadi, response ni e'tiborsiz qoldiradi |
.task { await ... } | Ko'rinish paydo bo'lganda asinxron ish boshlaydi |
await MainActor.run { } | UI yangilash uchun asosiy oqimda bajaradi |
π― Topshiriq: haqiqiy foydalanuvchilar olish
UserListView nomli yangi SwiftUI View yarating. Postlar emas, https://jsonplaceholder.typicode.com/users dan foydalanuvchilar oling. id, name va email xususiyatli User struct yarating. Har bir foydalanuvchining ismi va emailini List da ko'rsating. Simulyatorda ishlatib, 10 ta haqiqiy foydalanuvchi paydo bo'lishini tasdiqlang.
Bonus: NavigationStack va .navigationTitle("Foydalanuvchilar") qo'shing.