Sobes.tech
Middle

Kuidas rakendada mitmetöötlust, kasutades järjekordi?

sobes.tech AI

Vastus AI-lt

Kui rakendada mitme niidiga töötamist iOS-is, kasutatakse tehnoloogiaid GCD (Grand Central Dispatch) või Operation Queues.

GCD (Grand Central Dispatch)

GCD on madala taseme C API, mis võimaldab hallata paralleelsete ülesannete täitmist, kasutades dispetsšerijärjekordi.

GCD põhimõisted:

  • Dispetsšerijärjekorrad (Dispatch Queues): Andmestruktuurid, mis haldavad koodilõike (ülesandeid) täitmist. Võivad olla järjestikused (serial) või paralleelsed (concurrent).
  • Globaalne paralleeljärjekord (Global Concurrent Queues): Süsteemi järjekorrad, mis on vaikimisi saadaval, erinevad prioriteedi (qos - Quality of Service) poolest.
  • Peamine järjekord (Main Queue): See on järjestikune järjekord, mis on seotud UI põhivooluga. Kasutatakse kasutajaliidese uuendamiseks.

GCD näide:

import Foundation

// Saada kõrge prioriteediga globaalne paralleeljärjekord
let globalQueue = DispatchQueue.global(qos: .userInitiated)

// Saada peamine järjekord
let mainQueue = DispatchQueue.main

// Asünkroonselt täita ülesannet globaaljärjekorras
globalQueue.async {
    // Täita pikk ülesanne...
    print("Täidetakse taustal")

    // Liikuge UI uuendamiseks peamise järjekorra juurde (vajadusel)
    mainQueue.async {
        // Uuenda UI...
        print("UI uuendamine peamisel voolul")
    }
}

// Looge ja kasutage kasutaja määratud järjestikust järjekorda
let serialQueue = DispatchQueue(label: "com.example.mySerialQueue")

serialQueue.async {
    print("Ülesanne 1 järjekorras")
}

serialQueue.async {
    print("Ülesanne 2 järjekorras") // Täidetakse pärast Ülesannet 1
}

Operation Queues

Operation Queues on kõrgema taseme abstraktsioon GCD-le, mis põhineb Operation objektidel.

Operation Queues põhimõisted:

  • Operatsioonid (Operation): Objekti, mis esindab tööüksust. Võivad olla Operation alamklassid (näiteks, BlockOperation, URLSessionDownloadTask). Toetavad sõltuvusi operatsioonide vahel.
  • Operatsioonijärjekorrad (OperationQueue): Objekti, mis haldab Operation täitmist. Võivad olla konfigureeritud piirama samaaegselt täidetavate operatsioonide arvu (maxConcurrentOperationCount).

Näide Operation Queues kasutamisest:

import Foundation

// Looge operatsioonijärjekord
let operationQueue = OperationQueue()

// Valikuliselt: piirata samaaegselt täidetavate operatsioonide arvu
operationQueue.maxConcurrentOperationCount = 3

// Looge operatsioon
let operation1 = BlockOperation {
    print("Operatsioon 1 täidetakse")
    // Täida ülesanne...
}

let operation2 = BlockOperation {
    print("Operatsioon 2 täidetakse")
    // Täida ülesanne...
}

// Looge operatsioon koos sulgudega (alternatiivne viis)
let operation3 = BlockOperation {
    print("Operatsioon 3 täidetakse")
    // Täida ülesanne...
}

// Lisa lõpetamise sulg
operation3.completionBlock = {
    print("Operatsioon 3 lõpetatud")
}

// Lisa sõltuvused (Operatsioon 2 täidetakse pärast Operatsiooni 1)
operation2.addDependency(operation1)

// Lisa operatsioonid järjekorda
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)

// Operatsioonid hakkavad täituma asünkroonselt, sõltuvalt saadaval olevatest niitidest ja sõltuvustest

GCD ja Operation Queues võrdlus:

Omadus GCD (Grand Central Dispatch) Operation Queues
Abstraktsiooni tase Madal (C API) Kõrge (Objective-C/Swift klassid)
Ülesannete haldamine Blokid või funktsioonid Operation objektid
Sõltuvused Vajavad käsitsi haldamist (näiteks, DispatchGroup) Sisseehitatud tugi addDependency kaudu
Tühistamine Raske Lihtne (käsuga cancel())
Seisundid Ei ole selget seisundit Toetab seisundeid (valmis, täidetud, lõpetatud)
Jälgimine Vajab käsitsi rakendamist KVO (Key-Value Observing) tugi
Komplekssus Sobib paremini lihtsatele, tühistamatutele ülesannetele Sobib paremini keerukatele, sõltuvustele ja tühistamisele ülesannetele

Valik GCD ja Operation Queues vahel sõltub ülesande spetsiifikast. GCD on kerge ja sobib lihtsatele taustatöödele. Operation Queues pakuvad suuremat paindlikkust, sõltuvuste ja tühistamise toe, mistõttu on need eelistatumad keerukamate ülesannete haldamisel. Enamasti ehitatakse Operation Queues GCD-i peal.