Sobes.tech
Junior

რა არის მუშაობა იმ ნაკადებთან, რომლებიც განსხვავდება ძირითადი (main thread)-დან?

sobes.tech AI

პასუხი AI-სგან

iOS-те негизги (main thread) эмес, башка агымдар менен иштөө асинхрондуу тапшырмаларды аткарууга мүмкүндүк берет, бул негизги UI агымын бөгөттөбөйт. Бул колдонмонун жооп берүүчүүлүгүн сактоо үчүн өтө маанилүү, өзгөчө узак мөөнөттүү операциялар, мисалы, тармактык суроолор, маалыматтарды иштетүү же файлдар менен иштөө учурунда.

Негизги механизмдер фоон агымдар менен иштөө үчүн:

  1. GCD (Grand Central Dispatch):

    • Төмөнкү деңгээлдеги C китепканасы.
    • Иш тапшырмаларынын кезектери (DispatchQueue) аркылуу иштейт.
    • Параллел жана үзгүлтүксүз кезектерди түзө алат.
    • Глобалдык (конкуренттүү) жана негизги агымдын (main) кезектери менен иштейт.
    • Код блокторун фоон режиминде аткарууда жөнөкөй.
    // Глобалдык кезекте код аткаруу
    DispatchQueue.global(qos: .userInitiated).async {
        // Узун операция
        print("Тапшырма фоон агымында аткарылды")
    
        // UI жаңыртуу үчүн негизги агымга кайтуу
        DispatchQueue.main.async {
            // UI жаңыртуу
            print("UI негизги агымда жаңыртылды")
        }
    }
    
  2. Operation Queues (Operation жана OperationQueue):

    • Жогорку деңгээлдеги абстракция, негизделген GCD.
    • Тапшырмаларды Operation объектисинде көрсөтөт.
    • Тапшырмалардын ортосундагы көзкарандылыктарды башкарууга, токтотууга, жокко чыгарууга жана кайра иштетүүгө мүмкүндүк берет.
    • Кыйынчылык чынжырларын башкарууда ыңгайлуу.
    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if self.isCancelled { return }
            // Узун операция
            print("Operation фоон агымында аткарылды")
    
            if self.isCancelled { return }
            // UI жаңыртуу үчүн негизги агымга кайтуу
            OperationQueue.main.addOperation {
                 print("UI Operationтен жаңыртылды")
            }
        }
    }
    
    // Операциялар кезегин түзүү
    let queue = OperationQueue()
    queue.qualityOfService = .userInitiated
    
    // Операцияларды кошуу
    queue.addOperation(MyOperation())
    
  3. Async/Await (Concurrency):

    • Модерн Swift-ке негизделген асинхрондуу программалоо механизми.
    • async жана await ачкыч сөздөрүн колдонуп, асинхрондуу функцияларды белгилөө жана алардын аяктоосун күтүү.
    • Асинхрондуу кодду жазууну жана окууну жөнөкөйлөтөт, "callback hell"-ден качуу.
    • Автоматик түрдө агымдарды которууга жардам берет.
    func fetchData() async -> Data? {
        // Тармактык суроо моделдөө
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        print("Маалымат асинхрондуу функцияда алынды")
        return Data()
    }
    
    // Асинхрондуу функцияны Task аркылуу чакыруу
    Task {
        if let data = await fetchData() {
            print("Алынып жаткан маалыматтын өлчөмү: \(data.count)")
            // Автоматтык түрдө ылайыктуу контексте (мүмкүн main үчүн UI жаңыртуу)
        }
    }
    

Маанилүү аспектилер:

  • Агымдардын коопсуздугу (Thread Safety): Маҳз керек болсо, ар кандай агымдардан жалпы ресурстарга (променливдер, объекттер) кирүүдө сак болуңуз, маалыматтык жарыштардан качуу үчүн. Бул үчүн блокирлөө (locks), кезектер (сериялоо үчүн) же атомардык операциялар колдонулат.
  • UI жаңыртуу: UI элементтерин гана негизги агымда (DispatchQueue.main же OperationQueue.main) жаңыртыңыз. Фон агымдан UI жаңыртуу аракеттери ката же күтүүсүз жүрүм-турумга алып келет.
  • Оптималдаштыруу: Тапшырманын түрүнө ылайык туура механизмди тандаңыз. GCD жөнөкөй асинхрон блоктор үчүн, Operation Queues — кыйынчылык чынжырларын башкаруу үчүн, Async/Await — заманбап жана структураланган асинхрон код үчүн.
  • Приоритеттер (QoS): Тапшырмалар үчүн кызмат сапатын белгилеңиз, системага алардын артыкчылыктарын туура башкарууга жана ресурстарды бөлүштүрүүгө мүмкүндүк берет.
Механизм Абрстакция деңгээли Төзүмдүүлүк башкаруу Жокко чыгаруу/Пауза Колдонуу жөнөкйлүгү
GCD Төмөн Жок (тек негизги) Кыйын Орта
Operation Queues Жогорку Ооба Жөнөкөй Орта/Жогорку
Async/Await Жогорку Кээде встроено Жөнөкөй (Task) Жогорку

Туура колдонуу фоон агымдар iOS тиркемелерин натыйжалуу жана жооп берүүчү кылуу үчүн абдан маанилүү.