Sobes.tech
Middle

Kas yra darbo su kitais nei pagrindinis (off main thread) srautais?

sobes.tech AI

Atsakymas iš AI

Darbas su srautais, kurie skiriasi nuo pagrindinio, apima išteklių arba ilgalaikių operacijų (pavyzdžiui, tinklo užklausos, duomenų apdorojimas, duomenų bazės darbai) vykdymą foniniame režime, kad pagrindinis srautas (UI Thread) nebūtų užblokuotas. Tai yra labai svarbu išlaikyti naudotojo sąsajos reakciją.

iOS dažniausiai naudojamos:

  1. Grand Central Dispatch (GCD): Aukšto našumo technologija paraleliniam ir konkurenciniam užduočių vykdymui:

    • Privalumai: Paprastas naudojimas, automatinis srautų pulių valdymas, našumo optimizavimas.
    • Trūkumai: Sudėtingumas atšaukiant operacijas, mažesnė lankstumas valdant operacijų gyvavimo ciklą, palyginti su Operation Queues.

    GCD naudojimo pavyzdys:

    // Vykdyti užduotį globalioje eilėje (foninis srautas)
    DispatchQueue.global(qos: .userInitiated).async {
        // Jūsų kodas, kuris atlieka ilgą operaciją
        print("Vykdoma foniniame sraute")
    
        // Baigus, jei reikia atnaujinti UI, grįžkite į pagrindinį srautą
        DispatchQueue.main.async {
            // UI atnaujinimas
            print("UI atnaujinimas pagrindiniame sraute")
        }
    }
    
  2. Operation Queues (NSOperationQueue/Operation): Objektinis apvalkalas virš GCD, leidžiantis lankstesnį valdymą:

    • Privalumai: Priklausomybių valdymas tarp operacijų, galimybė atšaukti operacijas, lengva pakartotinai naudoti ir sustabdyti.
    • Trūkumai: Šiek tiek sudėtingesnė sintaksė nei GCD paprastoms užduotims.

    Pavyzdys:

    // Sukurti operacijų eilę
    let operationQueue = OperationQueue()
    
    // Sukurti operaciją (galite naudoti BlockOperation arba sukurti savo klasę, paveldinčią iš Operation)
    let myOperation = BlockOperation {
        // Jūsų kodas, kuris atlieka ilgą operaciją
        print("Vykdoma foninė operacija")
    }
    
    // Pridėti operaciją į eilę
    operationQueue.addOperation(myOperation)
    
  3. Manual Threads (NSThread): Žemiausias lygis, leidžiantis rankiniu būdu kurti ir valdyti srautus:

    • Privalumai: Pilnas valdymas
    • Trūkumai: Sudėtingumas, reikalingas rankinis srauto gyvavimo ciklo valdymas, sinchronizacija ir išvengimas lenktynių sąlygų, dažnai nerekomenduojama šiuolaikiniame iOS programavime.

    Pavyzdys:

    // Sukurti ir paleisti srautą
    let myThread = Thread {
        // Kodas, vykdomas naujame sraute
        print("Vykdymas naujame sraute naudojant NSThread")
    }
    myThread.start()
    

Privalumai dirbant už pagrindinio srauto ribų:

  • UI reakcija: Naudotojo sąsaja lieka sklandi ir reaguojanti, nes pagrindinis srautas nėra blokuojamas.
  • Našumas: Lygiagrečiu vykdymu gali pagreitinti bendrą programos veikimą, naudojant kelių branduolių procesorius.
  • UX gerinimas: Naudotojas nemato "užšaldžiusios" programos ilgų operacijų metu.

Svarbūs punktai:

  • UI atnaujinimas: Bet koks naudotojo sąsajos elementų atnaujinimas turi būti atliekamas tik pagrindiniame (UI) sraute. Bandymas atnaujinti UI iš foninio srauto gali sukelti nenuspėjamą elgesį arba programos avariją.
  • Sinchronizacija: Dirbant su bendrais ištekliais (kintamaisiais, objektais) keliuose srautuose, būtina naudoti sinchronizacijos mechanizmus (semaforus, užraktus, barjerines eilutes), kad išvengtumėte lenktynių sąlygų.
  • Atšaukimas: Ilgalaikėms foninėms užduotims svarbu užtikrinti jų atšaukimo galimybę, pavyzdžiui, jei naudotojas išeina iš ekrano. Operation Queues turi įmontuotą atšaukimo mechanizmą. GCD tai gali būti sudėtingiau įgyvendinti.

Pasirinkimas tarp GCD ir Operation Queues priklauso nuo užduoties specifikos. Paprastoms foninėms operacijoms dažnai pakanka GCD. Sudėtingesniems scenarijams su priklausomybėmis arba atšaukimo poreikiu geriau naudoti Operation Queues. NSThread šiuolaikinėje programavime retai naudojamas.