Sobes.tech
Middle

Asosiy (off main thread) bo'ylab ishlash nima?

sobes.tech AI

AIdan javob

Guruh bilan ishlash, asosiy bilan ishlashdan farq qiladigan oqimlar bilan ishlash, resurslarga ogʻir yoki uzoq davom etadigan operatsiyalarni (masalan, tarmoq soʻrovlar, maʼlumotlarni qayta ishlash, maʼlumotlar bazasi bilan ishlash) fon rejimida bajarishni oʻz ichiga oladi, shunda asosiy oqim (UI Thread) bloklanmaydi. Bu foydalanuvchi interfeysining javob beruvchanligini saqlash uchun muhimdir.

iOS uchun, odatda, quyidagilar ishlatiladi:

  1. Grand Central Dispatch (GCD): Tashqi va raqobatbardosh vazifalarni bajarish uchun yuqori samarali texnologiya.

    • Afzalliklar: Foydalanish oson, oqimlar havuzini avtomatik boshqarish, ishlashni optimallashtirish.
    • Kamchiliklar: Operatsiyalarni bekor qilishda qiyinchiliklar, Operation Queues bilan taqqoslaganda vazifalarning hayot aylanishini boshqarish kamroq moslashuvchan.

    GCD uchun misol:

    // Global navbatda vazifa bajarish (fon oqimi)
    DispatchQueue.global(qos: .userInitiated).async {
        // Sizning uzun operatsiya kodingiz
        print("Fon oqimida vazifa bajarilmoqda")
    
        // Tugagach, UI-ni yangilash kerak bo'lsa, asosiy oqimga qayting
        DispatchQueue.main.async {
            // UI yangilash
            print("Asosiy oqimda UI yangilash")
        }
    }
    
  2. Operation Queues (NSOperationQueue/Operation): GCD ustiga ob'ektga asoslangan qoplama, vazifalarni boshqarishni yanada moslashuvchan qiladi.

    • Afzalliklar: Operatsiyalar orasidagi bogʻliqliklarni boshqarish, operatsiyalarni bekor qilish imkoniyati, qayta ishlatish va toʻxtatish oson.
    • Kamchiliklar: Oddiy vazifalar uchun GCD bilan taqqoslaganda biroz murakkab sintaksis.

    OperationQueue misoli:

    // Operatsiyalar navbatini yaratish
    let operationQueue = OperationQueue()
    
    // Operatsiya yaratish (BlockOperation yoki o'z klassingizni yaratishingiz mumkin, Operation'dan meros olgan)
    let myOperation = BlockOperation {
        // Sizning uzun operatsiya kodingiz
        print("Fon operatsiyasida vazifa bajarilmoqda")
    }
    
    // Operatsiyani navbatga qo'shish
    operationQueue.addOperation(myOperation)
    
  3. Qoʻlda oqimlar (NSThread): Eng pastki daraja, oqimlarni qoʻlda yaratish va boshqarish imkonini beradi.

    • Afzalliklar: Oqim ustidan toʻliq nazorat.
    • Kamchiliklar: Yuqori murakkablik, oqimning hayot aylanishini qoʻlda boshqarish, sinxronizatsiya va raqib shartlardan qochish. Zamonaviy iOS rivojlanishida kamdan-kam ishlatiladi.

    NSThread misoli (juda kam ishlatiladi):

    // Oqim yaratish va ishga tushirish
    let myThread = Thread {
        // Yangi oqimda bajariladigan kod
        print("NSThread yordamida yangi oqimda bajarilmoqda")
    }
    myThread.start()
    

Asosiy oqimdan tashqarida ishlashning afzalliklari:

  • UI javob beruvchanligi: Foydalanuvchi interfeysi silliq va javob beradigan qoladi, chunki asosiy oqim bloklanmaydi.
  • Ishlash samaradorligi: Vazifalarni parallel bajarish umumiy ish faoliyatini oshirishi mumkin, ko'p yadroli protsessorlardan foydalanadi.
  • UX yaxshilash: Foydalanuvchi "qayg'urib" qolmaydi, uzoq davom etadigan operatsiyalar davomida.

Muhim nuqtalar:

  • UI yangilash: Har qanday UI elementlarini yangilash faqat asosiy (UI) oqimida bajarilishi kerak. Fon oqimidan UI-ni yangilashga urinish, noaniq xatti-harakatlar yoki ilovaning toʻxtashiga olib keladi.
  • Sinxronizatsiya: Bir nechta oqimdan umumiy resurslar (o'zgaruvchilar, obyektlar) bilan ishlashda, raqib shartlarni oldini olish uchun sinxronizatsiya mexanizmlari (semoforlar, bloklar, toʻsiqli navbatlar) ishlatilishi kerak.
  • Operatsiyalarni bekor qilish: Uzoq davom etadigan fon vazifalari uchun, ularni bekor qilish imkoniyatini ta'minlash muhim, masalan, foydalanuvchi ekranni tark etganda. Operation Queues o'z ichiga olgan bekor qilish mexanizmini taklif qiladi. GCD uchun bu biroz qiyinroq bo'lishi mumkin.

GCD va Operation Queues orasidagi tanlov, vazifaning tabiatiga bog'liq. Oddiy fon operatsiyalari uchun GCD odatda etarli. Murakkabroq senariylar uchun, bogʻliqliklar yoki bekor qilish ehtiyoji bilan, Operation Queues afzalroq. NSThread esa zamonaviy rivojlanishda kamdan-kam ishlatiladi.