Middle
Czym jest Grand Central Dispatch i jak jest używany w rozwoju iOS?
sobes.tech AI
Odpowiedź od AI
Grand Central Dispatch (GCD) — niskopoziadowe API do zarządzania wielowątkowością, zapewniające pulę wątków systemowych i planujące wykonywanie zadań na nich.
Główne koncepcje GCD:
- Kolejki dispatch: Kolejki, do których umieszczane są bloki kodu (zadania) do wykonania.
- Kolejki serialne: Wykonują bloki w kolejności dodania, po jednym.
- Kolejki współbieżne: Wykonują bloki równolegle, ale w kolejności dodania.
- Zadania (Bloki): Jednostki pracy wysyłane do kolejek dispatch.
- Źródła dispatch: Monitorowanie zdarzeń systemowych (pliki, gniazda, sygnały), wywołujące wykonanie bloków w ich wystąpieniu.
Używa się do:
-
Wykonywania operacji w tle: Ładowanie danych z sieci, przetwarzanie obrazów, skomplikowane obliczenia, aby nie blokować głównego wątku (UI).
DispatchQueue.global(qos: .userInitiated).async { // Wykonanie operacji zasobożernej let processedData = performHeavyProcessing() DispatchQueue.main.async { // Aktualizacja UI na głównym wątku updateUI(with: processedData) } } -
Planowanie zadań: Opóźnione lub periodyczne wykonywanie.
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Ten kod wykona się za 2 sekundy print("Opóźnione wykonanie") } -
Synchronizacja dostępu do danych: Użycie kolejek serialnych lub
DispatchQueue.concurrentPerformdo kontroli równoległego dostępu.let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent) var sharedArray = [Int]() func addItem(_ item: Int) { syncQueue.async(flags: .barrier) { // Użycie .barrier dla wyłącznego dostępu podczas zapisu sharedArray.append(item) } } func processItems() { syncQueue.sync { // Synchroniczne odczyty for item in sharedArray { print(item) } } }
Zalety w porównaniu do ręcznego zarządzania wątkami (POSIX threads):
- Łatwość użycia: Wyższy poziom abstrakcji.
- Wydajność: GCD zarządza pulą wątków systemowych bardziej optymalnie, zmniejszając koszty.
- Skalowalność: Automatycznie dostosowuje się do liczby rdzeni procesora.
Typy QoS (Jakość usług): Określa priorytet zadania dla planisty GCD.
| QoS | Zastosowanie |
|---|---|
| userInteractive | Aktualizacje UI, animacje, szybka reakcja |
| userInitiated | Zadania inicjowane przez użytkownika, wymagające szybkiego zakończenia (ładowanie, przetwarzanie zdjęć) |
| default | Priorytet domyślny, pomiędzy userInitiated a utility |
| utility | Zadania długotrwałe bez pilności (ładowanie, indeksowanie) |
| background | Zadania niewidoczne dla użytkownika (kopie zapasowe, synchronizacja w tle) |
| unspecified | Priorytet nieokreślony, ustalany przez system |