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 ollaOperationalamklassid (näiteks,BlockOperation,URLSessionDownloadTask). Toetavad sõltuvusi operatsioonide vahel. - Operatsioonijärjekorrad (
OperationQueue): Objekti, mis haldabOperationtä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.