Published on

Tortib yangilash (pull to refresh)

Authors

Tortib yangilash

Tortib yangilash β€” foydalanuvchi ro'yxat tepasidan pastga tortib, spinner ko'rib, kontent yangilanadigan harakat. Twitter, Pochta va Yangiliklar ilovalarida minglab marta qilgansiz. SwiftUI-da bu faqat bitta modifikator: .refreshable.

Bu dars qisqa, chunki .refreshable deyarli hamma narsani o'zi qiladi: harakatni boshqaradi, spinner ko'rsatadi va ish tugaguncha yashirmaydi. Sizning ishingiz faqat "yangilash" nima ekanligini tavsiflash.

Oldindan bilish kerak bo'lgan narsa: .refreshable Swift-ning async/await sintaksisidan foydalanadi. To'liq o'rganish Stage 8-da (Tarmoq bilan ishlash). Hozircha pattern qanday ko'rinishini va kalit so'zlar nimani anglatishini bilib olamiz.

Swift
ContentView.swift
import SwiftUI struct ContentView: View { @State private var kitoblar = ["Dune", "1984", "Hobbit"] var body: some View { NavigationStack { List(kitoblar, id: \.self) { kitob in Text(kitob) } .navigationTitle("Kitoblar") // .refreshable foydalanuvchi ro'yxat tepasini tortib pastga siljitganda ishlaydi .refreshable { // await bu yerda to'xtaydi va fetchLatestBooks() tugashini kutadi await fetchLatestBooks() } } } // async β€” to'xtatilishi va davom ettirilishi mumkin funksiya func fetchLatestBooks() async { // Tarmoq kechikishini simulyatsiya qilish β€” real ilovada API chaqiruvi bo'ladi try? await Task.sleep(for: .seconds(1)) // "Tarmoq" tugagandan so'ng massivni yangilash kitoblar = ["Dune", "1984", "Hobbit", "Foundation"] } }

@MainActor bilan yangilash

.refreshable {
    // @State xususiyatlarini har doim asosiy oqimda yangilang
    await maΚΌlumotniYukla()
}

// @MainActor bu funksiya asosiy oqimda ishlashini kafolatlaydi
@MainActor
func maΚΌlumotniYukla() async {
    let yangiKitoblar = await APIdan_olish()
    kitoblar = yangiKitoblar
}

SwiftUI view-lari asosiy oqimda yangilanishi kerak. Funksiyaga @MainActor qo'yish buni kafolatlaydi. Stage 8-da haqiqiy API-larni chaqirganda bu patternni tez-tez ishlatasiz.

Keng tarqalgan xato: Fon oqimidan @State ni yangilash. Agar async funksiyangiz haqiqiy tarmoq ishini bajarib, noto'g'ri oqimdan holatni yangilasa, Xcode da ogohlantirishlar ko'rasiz. Buni tuzatish uchun yangilash funksiyangizda @MainActor ishlating. Buning haqida Stage 8 da batafsil.

Tezkor ma'lumotnoma

SintaksisVazifasi
.refreshable { await ... }List yoki ScrollView-ga tortib yangilash qo'shadi
func nomi() asyncFunksiyani asinxron deb belgilaydi β€” to'xtatilishi mumkin
await funksiya()Async funksiya tugashini kutadi
try? await Task.sleep(for: .seconds(n))Async bajarilishini n soniya to'xtatadi β€” kechikish simulyatsiyasi
@MainActorFunksiya asosiy oqimda ishlashini kafolatlaydi β€” UI yangilanishlari uchun

Topshiriq: yangilanadigan ro'yxat

@State massiv va List yarating. .refreshable qo'shing. Async funksiyada 1 soniya kutib (Task.sleep), massivga yangi element qo'shing. Simulyatorda tortib yangilashni sinab ko'ring va spinner ko'rinib, keyin yangi element paydo bo'lishini kuzating.

Buy mea coffee