Hogyan valósítható meg a több szálú végrehajtás sorok használatával?
sobes.tech MI
Válasz az MI-től
Az iOS több szálon futó végrehajtásának megvalósításához GCD (Grand Central Dispatch) vagy Operation Queues technológiákat használnak.
GCD (Grand Central Dispatch)
A GCD egy alacsony szintű C API, amely párhuzamos feladatok kezelésére szolgál, dispatch sorokat használva.
A GCD főbb fogalmai:
- Dispatch sorok (
Dispatch Queues): Adatszerkezetek, amelyek a kódblokkok (feladatok) végrehajtását irányítják. Lehetnek szekvenciális (serial) vagy párhuzamos (concurrent). - Globális párhuzamos sorok (
Global Concurrent Queues): Rendszerszintű sorok, amelyek alapértelmezés szerint elérhetők, különböző prioritással (qos - Quality of Service). - Fő sor (
Main Queue): Ez egy szekvenciális sor, amely a UI fő szálához van kötve. A felhasználói felület frissítésére használják.
GCD használatának példája:
import Foundation
// Egy magas prioritású globális párhuzamos sor elérése
let globalQueue = DispatchQueue.global(qos: .userInitiated)
// A fő sor elérése
let mainQueue = DispatchQueue.main
// Aszinkron feladat végrehajtása a globális soron
globalQueue.async {
// Hosszú ideig tartó feladat végrehajtása...
print("Háttér szálon fut")
// Visszatérés a fő sorhoz UI frissítéshez (ha szükséges)
mainQueue.async {
// UI frissítése...
print("UI frissítése a fő szálon")
}
}
// Egyéni szekvenciális sor létrehozása és használata
let serialQueue = DispatchQueue(label: "com.example.mySerialQueue")
serialQueue.async {
print("Első feladat a szekvenciális sorban")
}
serialQueue.async {
print("Második feladat a szekvenciális sorban") // az első után fog végrehajtódni
}
Operation Queues
Az Operation Queues egy magas szintű absztrakció a GCD felett, az Operation objektumokra alapozva.
Az Operation Queues főbb fogalmai:
- Műveletek (
Operation): Olyan objektumok, amelyek egy munkafolyamatot képviselnek. Lehetnek azOperationalosztályai (pl.BlockOperation,URLSessionDownloadTask). Függőségeket támogatnak. - Műveleti sorok (
OperationQueue): Olyan objektumok, amelyek azOperationvégrehajtását kezelik. Beállíthatók a maximális párhuzamos végrehajtott műveletek számának korlátozására (maxConcurrentOperationCount).
Operation Queues használatának példája:
import Foundation
// Műveleti sor létrehozása
let operationQueue = OperationQueue()
// Opcionálisan: a párhuzamos műveletek számának korlátozása
operationQueue.maxConcurrentOperationCount = 3
// Műveletek létrehozása
let operation1 = BlockOperation {
print("Művelet 1 végrehajtódik")
// Feladat végrehajtása...
}
let operation2 = BlockOperation {
print("Művelet 2 végrehajtódik")
// Feladat végrehajtása...
}
// Alternatív módszer: blokk segítségével művelet létrehozása
let operation3 = BlockOperation {
print("Művelet 3 végrehajtódik")
// Feladat végrehajtása...
}
// Egy befejező blokk hozzáadása
operation3.completionBlock = {
print("Művelet 3 befejeződött")
}
// Függőségek hozzáadása (A 2-es művelet a 1-es után fog végrehajtódni)
operation2.addDependency(operation1)
// Műveletek hozzáadása a sorhoz
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)
// A műveletek aszinkron módon indulnak el, a rendelkezésre álló szálak és függőségek szerint
GCD és Operation Queues összehasonlítása:
| Jellemzők | GCD (Grand Central Dispatch) | Operation Queues |
|---|---|---|
| Absztrakció szintje | Alacsony (C API) | Magas (Objective-C/Swift osztályok) |
| Feladatkezelés | Blokkok vagy függvények | Operation objektumok |
| Függőségek | Kézi kezelés szükséges (pl. DispatchGroup) |
Beépített támogatás addDependency-vel |
| Lemondás | Nehéz | Egyszerű (cancel() metódus) |
| Állapot | Nincs egyértelmű állapot | Támogatja az állapotokat (kész, fut, befejezett) |
| Megfigyelés | Kézi megvalósítás szükséges | KVO (Key-Value Observing) támogatott |
| Komplexitás | Egyszerű, nem-lemondható feladatokhoz alkalmas | Komplex, függő és lemondható feladatokhoz ideális |
A választás a GCD és az Operation Queues között a feladat sajátosságaitól függ. A GCD könnyebb és alkalmas egyszerű háttérfeladatokra. Az Operation Queues rugalmasabb irányítást, függőségek és lemondás támogatását kínálja, így inkább összetettebb feladatkezelési forgatókönyvekhez ajánlott. A legtöbb esetben az Operation Queues a GCD fölött épül.