Sobes.tech
Junior

Kas yra daugiagyslumas?

sobes.tech AI

Atsakymas iš AI

„iOS“ daugiagijavimas reiškia kelių srautų (threads) naudojimą viename programos procese, leidžiantį vykdyti kelias užduotis vienu metu arba pseudo vienu metu, išvengiant pagrindinio UI srauto užblokavimo ir išlaikant sąsajos reagavimą.

Principai ir komponentai:

  • Gija (Thread): Nepriklausoma vykdymo vienetas procese. Turi savo iškvietimų steką ir registrų rinkinį, tačiau dalijasi atmintimi su kitomis tos pačios proceso gijomis.
  • Pagrindinė gija (Main Thread): Atsakinga už UI atnaujinimą ir naudotojo įvykių apdorojimą. Bet kokia ilgalaikė operacija joje sukelia programos "užšalimą".
  • Fono gijomis (Background Threads): Naudojamos atliekant išteklių reikalaujančias užduotis (tinklo užklausos, skaičiavimai, duomenų apdorojimas) be pagrindinio srauto blokavimo.
  • Lenktynių sąlyga (Race Condition): Atsitinka, kai du arba daugiau gijų vienu metu bando pasiekti bendrus duomenis ir juos keisti, kas gali sukelti nenuspėjamus rezultatus.
  • Deadlock (Mirtinas užrakinimas): Situacija, kai dvi arba daugiau gijų laukia viena kitos, kad atlaisvintų išteklius, dėl ko nė viena negali tęsti.
  • iOS įrankiai daugiagijavimui:
    • GCD (Grand Central Dispatch): Žemo lygio API, pagrįsta eilėmis (dispatch queues). Valdo gijų baseiną ir paskirsto užduotis tarp jų. Palaiko sekcines ir paralelines eilutes.
    • Operation Queues (NSOperationQueue/Operation): Objektinis abstrakcija virš GCD. Leidžia kurti užduotis (Operation), valdyti jų priklausomybes, jas sustabdyti, atnaujinti ir atšaukti.
    • Užraktai (NSLock, DispatchQueue sync): Sinchronizacijos mechanizmai, skirti prieigos prie bendrų išteklių valdymui ir lenktynių sąlygų prevencijai.

GCD naudojimo pavyzdys:

// Vykdyti užduotį foninėje eilėje
DispatchQueue.global(qos: .userInitiated).async {
    // Ilgas veiksmas (pvz., duomenų įkėlimas)

    // Baigus, atnaujinti UI pagrindiniame sraute
    DispatchQueue.main.async {
        // UI atnaujinimas
    }
}

OperationQueue pavyzdys:

import Foundation

// Sukurti užduočių eilę
let operationQueue = OperationQueue()

// Sukurti užduotį
let operation = BlockOperation {
    // Ilgas veiksmas
    print("Užduotis vykdoma")
}

// Pridėti užduotį į eilę
operationQueue.addOperation(operation)

// Galima pridėti priklausomybes tarp užduočių
// let anotherOperation = ...
// operation.addDependency(anotherOperation)

Daugiagijavimas yra svarbus:

  • UI reakcijos greičio užtikrinimui.
  • Našumo didinimui naudojant paralelų vykdymą.
  • Efektyviam išteklių naudojimui įrenginyje.