Sobes.tech
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:

  1. 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)
        }
    }
    
  2. 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")
    }
    
  3. Synchronizacja dostępu do danych: Użycie kolejek serialnych lub DispatchQueue.concurrentPerform do 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