Kaip įgyvendinti daugiagijį naudojant eilutes?
sobes.tech AI
Atsakymas iš AI
Norint įgyvendinti daugiagijį vykdymą iOS, naudojamos GCD (Grand Central Dispatch) arba Operation Queues technologijos.
GCD (Grand Central Dispatch)
GCD – tai žemo lygio C API, skirta valdyti paralelines užduotis naudojant dispečerių eilutes.
Pagrindinės GCD koncepcijos:
- Dispečerio eilutės (
Dispatch Queues): Duomenų struktūros, valdančios kodų blokų (užduočių) vykdymą. Gali būti eilinės (serial) arba paralelios (concurrent). - Globalios paralelios eilutės (
Global Concurrent Queues): Sistemos eilutės, prieinamos pagal nutylėjimą, skiriasi pagal prioritetą (qos - Quality of Service). - Pagrindinė eilutė (
Main Queue): Tai eilinė, susijusi su pagrindiniu UI srautu. Naudojama vartotojo sąsajos atnaujinimui.
GCD naudojimo pavyzdys:
import Foundation
// Gauti aukšto prioriteto globalią paralelę eilutę
let globalQueue = DispatchQueue.global(qos: .userInitiated)
// Gauti pagrindinę eilutę
let mainQueue = DispatchQueue.main
// Asinchroniškai vykdyti užduotį globalioje eilutėje
globalQueue.async {
// Vykdyti ilgą užduotį...
print("Vykdoma fone")
// Pereiti į pagrindinę eilutę UI atnaujinimui (jei reikia)
mainQueue.async {
// Atnaujinti UI...
print("UI atnaujinimas pagrindiniame sraute")
}
}
// Kurti ir naudoti naudotojo sukurtą eilę
let serialQueue = DispatchQueue(label: "com.example.mySerialQueue")
serialQueue.async {
print("Užduotis 1 eilėje")
}
serialQueue.async {
print("Užduotis 2 eilėje") // Vykdys po Užduoties 1
}
Operation Queues
Operation Queues – tai aukštesnio lygio abstrakcija virš GCD, pagrįsta Operation objektais.
Pagrindinės Operation Queues koncepcijos:
- Operacijos (
Operation): Objekti, atstovaujantys darbo vienetą. Gali būtiOperationsubclass'ai (pvz.,BlockOperation,URLSessionDownloadTask). Palaiko priklausomybes tarp operacijų. - Operacijų eilės (
OperationQueue): Objekti, valdantysOperationvykdymą. Gali būti sukonfigūruotos riboti maksimalų vienu metu vykdomų operacijų skaičių (maxConcurrentOperationCount).
Pavyzdys, kaip naudoti Operation Queues:
import Foundation
// Sukurti operacijų eilę
let operationQueue = OperationQueue()
// Pasirinktinai: apriboti vienu metu vykdomų operacijų skaičių
operationQueue.maxConcurrentOperationCount = 3
// Sukurti operaciją
let operation1 = BlockOperation {
print("Operacija 1 vykdoma")
// Vykdyti užduotį...
}
let operation2 = BlockOperation {
print("Operacija 2 vykdoma")
// Vykdyti užduotį...
}
// Sukurti operaciją su užklausos bloku (alternatyvus būdas)
let operation3 = BlockOperation {
print("Operacija 3 vykdoma")
// Vykdyti užduotį...
}
// Pridėti užbaigimo bloką
operation3.completionBlock = {
print("Operacija 3 baigta")
}
// Pridėti priklausomybes (Operacija 2 vykdys po Operacijos 1)
operation2.addDependency(operation1)
// Pridėti operacijas į eilę
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)
// Operacijos pradės vykdyti asinchroniškai, priklausomai nuo prieinamų gijų ir priklausomybių
GCD ir Operation Queues palyginimas:
| Charakteristika | GCD (Grand Central Dispatch) | Operation Queues |
|---|---|---|
| Abstrakcijos lygis | Žemas (C API) | Aukštas (Objective-C/Swift klasės) |
| Užduočių valdymas | Blokai arba funkcijos | Operation objektai |
| Priklausomybės | Reikalauja rankinio valdymo (pvz., DispatchGroup) |
Integruota palaikymas per addDependency |
| Atšaukimas | Sunkiai | Lengvai (per cancel() metodą) |
| Būsenos | Nėra aiškios būsenos | Palaiko būsenas (paruošta, vykdoma, baigta) |
| Stebėjimas | Reikalauja rankinio įgyvendinimo | KVO (Key-Value Observing) palaikymas |
| Sudėtingumas | Tinka paprastoms, neatsisakančioms užduotims | Tinka sudėtingoms, tarpusavyje priklausomoms, atšaukiamoms užduotims |
Pasirinkimas tarp GCD ir Operation Queues priklauso nuo užduoties specifikos. GCD yra lengvesnis ir tinka paprastoms foninėms užduotims. Operation Queues siūlo lankstesnį valdymą, priklausomybių ir atšaukimo palaikymą, todėl dažnai yra geresnis pasirinkimas sudėtingesniems užduočių valdymo scenarijams. Daugeliu atvejų Operation Queues yra sukurtos virš GCD.