Published on

URLSession va async/await bilan ma'lumot olish

Authors

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.

Swift
PostListView.swift
import SwiftUI // API dan bitta postni saqlash uchun oddiy model struct Post: Codable, Identifiable { let id: Int let title: String let body: String } struct PostListView: View { // Olingan postlarni saqlash uchun holat o'zgaruvchisi @State private var posts: [Post] = [] var body: some View { List(posts) { post in VStack(alignment: .leading, spacing: 4) { Text(post.title) .font(.headline) Text(post.body) .font(.subheadline) .foregroundStyle(.secondary) } } // .task ko'rinish paydo bo'lganda ishlaydi va yo'qolsa bekor qiladi .task { await fetchPosts() } } // async bu funksiya await bilan chaqirilishi mumkinligini bildiradi func fetchPosts() async { // URL ni xavfsiz yaratish β€” noto'g'ri URL stringida erta chiqish guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { return } // do/catch xatolarni ushlaydi, halokat emas do { // await β€” data va response kelguncha shu yerda kutadi let (data, _) = try await URLSession.shared.data(from: url) // JSON ma'lumotini Post massiviga dekodlash let decoded = try JSONDecoder().decode([Post].self, from: data) // State ni asosiy oqimda yangilash β€” UI xavfsiz yangilanadi await MainActor.run { posts = decoded } } catch { // Xatoni chop etish β€” halokat emas print("Olish xatosi: \(error)") } } }
QatorVazifasi
struct Post: Codable, IdentifiableMa'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

SintaksisVazifasi
func load() asyncAwait 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.

Buy mea coffee