Sobes.tech
Junior

Czym jest GCD (Grand Central Dispatch) w kontekście rozwoju na iOS?

sobes.tech AI

Odpowiedź od AI

GCD (Grand Central Dispatch) to niskopoziomowe API firmy Apple do zarządzania operacjami równoległymi i wykonywania kodu asynchronicznego w aplikacjach. Zapewnia mechanizm wysyłania zadań do kolejek wykonawczych, które są zarządzane przez system.

Kluczowe cechy:

  • Kolejki zadań (Dispatch Queues): struktury FIFO, do których dodawane są bloki kodu (closures) do wykonania.
    • Pochodzą z typów concurrent (równoległe) i serial (sekwencyjne).
    • Oferują globalne kolejki systemowe i umożliwiają tworzenie własnych.
  • Bloki (Blocks): jednostki pracy wysyłane do kolejek.
  • Zarządzanie wątkami: abstrahuje programistę od bezpośredniego zarządzania wątkami, pozwalając systemowi optymalnie rozdzielać zadania między dostępne rdzenie procesora.
  • Priorytety: pozwalają określić priorytet dla zadań w globalnych kolejach concurrent.

Typy kolejek:

  • Serial (sekwencyjne): wykonują zadania ściśle jedno po drugim, w kolejności dodania. Gwarantują, że tylko jedno zadanie z tej kolejki jest wykonywane w danym momencie.
    • Główna kolejka (DispatchQueue.main) to specjalna kolejka serialowa do aktualizacji UI.
    • Własne kolejki serialowe.
  • Concurrent (równoległe): mogą wykonywać wiele zadań jednocześnie (równolegle), bez gwarancji kolejności zakończenia.
    • Systemowe globalne kolejki concurrent z różnymi poziomami jakości obsługi (QoS).
    • Własne kolejki concurrent.

Poziomy QoS dla globalnych kolejek concurrent:

Poziom QoS Opis Przykłady użycia
userInteractive Zadania, z którymi aktywnie współdziała użytkownik. Animacje, obsługa zdarzeń UI.
userInitiated Zadania uruchomione przez użytkownika, wymagające natychmiastowego wyniku. Ładowanie treści po kliknięciu przycisku.
utility Długotrwałe zadania, które nie wymagają natychmiastowego wyniku. Ładowanie danych, przetwarzanie obrazów w tle.
background Zadania w tle, niewidoczne dla użytkownika. Aktualizacja pamięci podręcznej, synchronizacja danych.
unspecified Poziom QoS nieokreślony, system ustala go samodzielnie. Stare API lub zadania niskopoziomowe systemu.

Przykład najprostszy:

// Wykonaj zadanie w tle (globalna kolejka concurrent)
DispatchQueue.global(qos: .userInitiated).async {
    // Wykonaj długotrwałą operację
    print("Wykonywanie zadania w tle")

    // Wróć do głównego wątku, aby zaktualizować UI
    DispatchQueue.main.async {
        print("Aktualizacja UI na głównym wątku")
    }
}

GCD upraszcza pracę z wielowątkowością i równoległością, czyniąc kod bardziej czytelnym i mniej podatnym na błędy race conditions w porównaniu do niskopoziomowego zarządzania wątkami (Thread).