Published on

SwiftUI-da onAppear va onDisappear β€” qanday ishlatish kerak

Authors

Bu videoda biz onAppear va onDisappear modifikatorlarini ko'rib chiqamiz. Ular aynan nomidan bilinganidek β€” view ekranda paydo bo'lganda yoki ekrandan yo'qolganda kod ishga tushiradi.

Masalan, rasm faqat ekranda ko'rinadigan bo'lgandagina yuklansin desangiz β€” onAppear buning uchun ideal. Foydalanuvchi ekrandan ketganda ma'lumotlar bazasiga so'rovlarni to'xtatish kerak bo'lsa β€” onDisappear yordamida.


Asosiy misol β€” onAppear

struct OnAppearBootcamp: View {

    @State var myText: String = "Boshlang'ich matn"

    var body: some View {
        NavigationView {
            ScrollView {
                Text(myText)
            }
            .onAppear {
                myText = "Bu yangi matn"
            }
            .navigationTitle("onAppear")
        }
    }
}

ScrollView ekranda paydo bo'lishi bilanoq onAppear ichidagi kod ishlaydi va myText yangilanadi. Ko'z ochib yumguncha sodir bo'ladi β€” foydalanuvchi boshlang'ich matnni ko'rmaydi.


DispatchQueue β€” kechiktirilgan kod

Kodni darhol emas, ma'lum vaqtdan keyin ishlatish uchun DispatchQueue ishlatiladi:

struct OnAppearBootcamp: View {

    @State var myText: String = "Boshlang'ich matn"

    var body: some View {
        NavigationView {
            ScrollView {
                Text(myText)
            }
            .onAppear {
                // ScrollView paydo bo'lganda darhol chaqiriladi
                // Lekin DispatchQueue 5 soniya kechiktiradi
                DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
                    myText = "Bu yangi matn"
                }
            }
            .navigationTitle("onAppear")
        }
    }
}

Bu qanday ishlaydi:

  1. ScrollView ekranda paydo bo'ladi
  2. onAppear darhol chaqiriladi
  3. DispatchQueue 5 soniya kutadi
  4. 5 soniyadan keyin myText yangilanadi va ekran yangilanadi

Kechiktirishni kamroq ishlatgan ma'qul, lekin kerak bo'lganda .now() + N β€” N o'rniga soniyalar sonini yozasiz.


onDisappear β€” view ekrandan ketganda

ScrollView {
    Text(myText)
}
.onAppear {
    myText = "Bu yangi matn"
}
.onDisappear {
    myText = "Tugash matni"
    // Ma'lumotlar bazasiga so'rovlarni to'xtatish
    // Taymerlarni bekor qilish
    // Resurslarni tozalash
}

onDisappear view ekrandan ketganda β€” masalan foydalanuvchi boshqa ekranga o'tganda yoki modal yopilganda β€” chaqiriladi. Ko'pincha ishlab turgan jarayonlarni to'xtatish uchun ishlatiladi.


Modifier qayerda turishi muhim

onAppear qaysi view-ga qo'yilganiga qarab, u har xil vaqtda chaqiriladi:

NavigationView {
    ScrollView {
        LazyVStack {
            ForEach(0..<50) { _ in
                RoundedRectangle(cornerRadius: 25)
                    .frame(height: 200)
                    .padding()
                    .onAppear {
                        // Har bir to'rtburchak ekranda paydo bo'lganda chaqiriladi
                        // 50 ta bo'lsa β€” 50 marta chaqiriladi
                        // Faqat ko'rinadigan bo'lganda, hammasi bir vaqtda emas
                    }
            }
        }
    }
    .onAppear {
        // ScrollView birinchi marta paydo bo'lganda β€” faqat 1 marta chaqiriladi
    }
}
.onAppear {
    // NavigationView paydo bo'lganda β€” faqat 1 marta chaqiriladi
}

LazyVStack bilan amaliy misol

LazyVStack faqat ekranda ko'rinadigan elementlarni yaratadi. onAppear bilan birgalikda har bir element ekranga chiqqanida alohida kuzatish mumkin:

struct OnAppearBootcamp: View {

    @State var count: Int = 0

    var body: some View {
        NavigationView {
            ScrollView {
                LazyVStack {
                    ForEach(0..<50) { _ in
                        RoundedRectangle(cornerRadius: 25)
                            .frame(height: 200)
                            .padding()
                            .onAppear {
                                count += 1
                                // Har bir yangi to'rtburchak ekranda
                                // paydo bo'lganda count bittaga ortadi
                            }
                    }
                }
            }
            .navigationTitle("onAppear: \(count)")
        }
    }
}

Natija:

  • Ilova ochilganda faqat 3 ta to'rtburchak ko'rinadi β†’ count = 3
  • Scroll qilganda yangi to'rtburchaklar paydo bo'ladi β†’ count oshib boradi
  • Hammasi bir vaqtda yuklanmaydi β€” faqat ekranda ko'rinadiganlar yuklanadi

Bu rasmlar yoki ma'lumotlarni faqat kerak bo'lgandagina yuklash uchun ideal usul.


Xulosa

ModifierQachon chaqiriladiAsosiy ishlatilishi
.onAppearView ekranda paydo bo'lgandaMa'lumot yuklash, taymer boshlash
.onDisappearView ekrandan ketgandaJarayonlarni to'xtatish, tozalash

Modifier qaysi view-ga qo'yilganiga e'tibor bering β€” ScrollView-ga qo'yilsa bir marta, ForEach ichidagi har bir elementga qo'yilsa har bir element uchun alohida chaqiriladi.

Rahmat, men Nick, bu Swiftful Thinking va keyingi videoda ko'rishguncha!

Buy mea coffee