Sobes.tech
Middle

Jak zaimplementować wielowątkowość z użyciem kolejek?

sobes.tech AI

Odpowiedź od AI

Aby zaimplementować wielozadaniowość w iOS, używa się technologii takich jak GCD (Grand Central Dispatch) lub Operation Queues.

GCD (Grand Central Dispatch)

GCD to niskopoziomowe API w C do zarządzania zadaniami równoległymi za pomocą kolejek dispatch.

Główne koncepcje GCD:

  • Kolejki dispatch (Dispatch Queues): Struktury danych zarządzające wykonywaniem bloków kodu (zadań). Mogą być sekwencyjne (serial) lub równoległe (concurrent).
  • Kolejki globalne równoległe (Global Concurrent Queues): Kolejki systemowe dostępne domyślnie, różniące się priorytetem (qos - Quality of Service).
  • Kolejka główna (Main Queue): To kolejka sekwencyjna powiązana z głównym wątkiem UI. Używana do aktualizacji interfejsu użytkownika.

Przykład użycia GCD:

import Foundation

// Uzyskanie globalnej kolejki równoległej o wysokim priorytecie
let globalQueue = DispatchQueue.global(qos: .userInitiated)

// Uzyskanie kolejki głównej
let mainQueue = DispatchQueue.main

// Asynchroniczne wykonanie zadania w kolejce globalnej
globalQueue.async {
    // Wykonanie długotrwałego zadania...
    print("Wykonywane w tle")

    // Powrót do kolejki głównej w celu aktualizacji UI (jeśli konieczne)
    mainQueue.async {
        // Aktualizacja UI...
        print("Aktualizacja UI w głównym wątku")
    }
}

// Tworzenie i użycie własnej kolejki sekwencyjnej
let serialQueue = DispatchQueue(label: "com.przyklad.mojSerialQueue")

serialQueue.async {
    print("Zadanie 1 w kolejce sekwencyjnej")
}

serialQueue.async {
    print("Zadanie 2 w kolejce sekwencyjnej") // Wykona się po Zadaniu 1
}

Operation Queues

Operation Queues to abstrakcja wysokiego poziomu nad GCD, oparta na obiektach Operation.

Główne koncepcje Operation Queues:

  • Operacje (Operation): Obiekty reprezentujące jednostkę pracy. Mogą być podklasami Operation (np. BlockOperation, URLSessionDownloadTask). Obsługują zależności między operacjami.
  • Kolejki operacji (OperationQueue): Obiekty zarządzające wykonaniem Operation. Mogą być konfigurowane do ograniczenia maksymalnej liczby jednoczesnych operacji (maxConcurrentOperationCount).

Przykład użycia Operation Queues:

import Foundation

// Tworzenie kolejki operacji
let operationQueue = OperationQueue()

// Opcjonalnie: ograniczenie liczby jednoczesnych operacji
operationQueue.maxConcurrentOperationCount = 3

// Tworzenie operacji
let operation1 = BlockOperation {
    print("Operacja 1 w toku")
    // Wykonanie zadania...
}

let operation2 = BlockOperation {
    print("Operacja 2 w toku")
    // Wykonanie zadania...
}

// Tworzenie operacji z zamknięciem (alternatywa)
let operation3 = BlockOperation {
    print("Operacja 3 w toku")
    // Wykonanie zadania...
}

// Dodanie bloku końcowego (completion block)
operation3.completionBlock = {
    print("Operacja 3 zakończona")
}

// Dodanie zależności (Operacja 2 wykona się po Operacji 1)
operation2.addDependency(operation1)

// Dodanie operacji do kolejki
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)

// Operacje rozpoczną się asynchronicznie w zależności od dostępnych wątków i zależności

Porównanie GCD i Operation Queues:

Cecha GCD (Grand Central Dispatch) Operation Queues
Poziom abstrakcji Niski (API w C) Wysoki (klasy Objective-C/Swift)
Zarządzanie zadaniami Bloki lub funkcje Obiekty Operation
Zależności Wymagają ręcznego zarządzania (np. DispatchGroup) Wbudowane wsparcie przez addDependency
Anulowanie Trudne Łatwe (przez metodę cancel() operacji)
Stan Brak wyraźnego stanu Obsługuje stany (gotowe, wykonuje się, zakończone)
Nadzór Wymaga ręcznej implementacji Wsparcie KVO (Key-Value Observing)
Złożoność Lepsze dla prostych, nie wymagających anulowania zadań Lepsze dla złożonych, zależnych i anulowalnych zadań

Wybór między GCD a Operation Queues zależy od specyfiki zadania. GCD jest lżejszy i odpowiedni dla prostych zadań w tle. Operation Queues oferują bardziej elastyczne zarządzanie, obsługę zależności i anulowania, co czyni je preferowanymi w bardziej złożonych scenariuszach zarządzania zadaniami.