Sobes.tech
Middle

Nima uchun iOSda asosiy oqimni yuklash tavsiya etilmaydi va uni oldini olish uchun qanday usullar mavjud?

sobes.tech AI

AIdan javob

Asosiy oqim foydalanuvchi interfeysini yangilash va UI voqealarini boshqarish uchun javobgardir. Har qanday uzoq davom etadigan operatsiyalar (tarmoq so'rovlar, og'ir hisoblashlar, fayllar bilan ishlash) asosiy oqimda uni bloklaydi, bu esa "qotib qolgan" UI, dastur javobining pastligi va hatto uning to'xtashiga (watchdog timeout) olib keladi.

Asosiy oqimga yukni oldini olish usullari:

  1. Grand Central Dispatch (GCD): Vazifalarni fon navbatlarida asinxron bajarishga imkon beradi.

    • DispatchQueue.global(): Turli prioritetlarga ega global fon navbatlariga kirish.
    • DispatchQueue.main: UI yangilash uchun asosiy navbat.
    • async { ... }: Kod blokini asinxron bajarish.
    // og'ir vazifani fon rejimida bajarish
    DispatchQueue.global(qos: .userInitiated).async {
        // og'ir hisoblashlar yoki tarmoq so'rovi
    
        // UI-ni asosiy oqimda yangilash
        DispatchQueue.main.async {
            // foydalanuvchi interfeysini yangilash
        }
    }
    
  2. Operation Queue (Operation & OperationQueue): GCD navbatlari ustidagi yuqori darajadagi abstraktsiya, operatsiyalar orasidagi bog'liqliklarni, bekor qilish va to'xtatishni qo'llab-quvvatlaydi.

    • OperationQueue(): Operatsiyalar navbatini yaratish.
    • Operation: navbatga qo'shilishi mumkin bo'lgan vazifalar uchun abstrakt sinf.
    • addOperation(_:): operatsiyani navbatga qo'shish.
    let downloadOperation = BlockOperation {
        // ma'lumotlarni yuklab olish
    }
    
    let parseOperation = BlockOperation {
        // ma'lumotlarni tahlil qilish
    }
    
    // bog'liqlik: tahlil yuklab olishdan so'ng boshlanadi
    parseOperation.addDependency(downloadOperation)
    
    let queue = OperationQueue()
    queue.addOperation(downloadOperation)
    queue.addOperation(parseOperation)
    
  3. Konkurrentlik (async/await): Swiftda asinxron dasturlash uchun zamonaviy yondashuv.

    • async: funksiyani asinxron sifatida belgilaydi.
    • await: asinxron operatsiyaning yakunlanishini kutadi.
    • Task: yangi konkurent vazifani yaratadi.
    func fetchData() async throws -> Data {
        let url = URL(string: "https://example.com/data")!
        let (data, _) = try await URLSession.shared.data(from: url)
        return data
    }
    
    func updateUI() {
        Task {
            do {
                let data = try await fetchData()
                // ma'lumotlarni qayta ishlash
                // UI-ni asosiy oqimda avtomatik yangilash
                // (Agar Task asosiy Actor yoki DispatchQueue.mainda yaratilgan bo'lsa)
            } catch {
                // xatoni qayta ishlash
            }
        }
    }
    
  4. Aktörlar: Turli konkurent kontekstlardan kirishga qarshi kurashadi, o'z holatiga eksklyuziv kirishni ta'minlaydi.

    actor DataStore {
        private var data: [String] = []
    
        func addData(_ item: String) {
            data.append(item)
        }
    
        func getData() -> [String] {
            return data
        }
    }
    
    let store = DataStore()
    
    Task {
        await store.addData("item1")
    }
    

GCD, Operation Queue va Concurrency o'rtasidagi tanlov vazifaning murakkabligiga, kerakli nazorat darajasiga va kodning tuzilish talablarga bog'liq. Concurrency zamonaviy ilovalarda o'qilishi va xavfsizligi uchun afzal ko'rilgan yondashuvdir.