Współbieżność z Grand Central Dispatch

Jan 24 2023
Co to jest GCD? Grand Central Dispatch został stworzony przez Apple ponad 10 lat temu jako abstrakcja, aby pomóc programistom w pisaniu kodu wielowątkowego bez ręcznego tworzenia wątków i zarządzania nimi. Współbieżność oznacza, że ​​dwa zadania mogą się uruchamiać, uruchamiać i kończyć w nakładających się przedziałach czasowych.

Co to jest GCD?

Grand Central Dispatch został stworzony przez Apple ponad 10 lat temu jako abstrakcja, aby pomóc programistom w pisaniu kodu wielowątkowego bez ręcznego tworzenia wątków i zarządzania nimi.

Współbieżność oznacza, że ​​dwa zadania mogą się uruchamiać, uruchamiać i kończyć w nakładających się przedziałach czasowych. Istnieją trzy sposoby osiągnięcia współbieżności w systemie iOS, wątkach, kolejkach wysyłkowych i kolejkach operacji.

„Zamiast bezpośredniego wątkowania, używasz GCD do planowania zadań roboczych, a system wykona je za Ciebie, maksymalnie wykorzystując swoje zasoby. GCD przejmie tworzenie wymaganych wątków i zaplanuje Twoje zadania w tych wątkach, przenosząc ciężar zarządzania wątkami z programisty na system”.

Największą zaletą GCD jest to, że nie musisz myśleć o zasobach sprzętowych podczas pisania współbieżnego kodu.

„Wszystkie kolejki wysyłkowe są strukturami danych typu „pierwsze weszło, pierwsze wyszło” (FIFO), więc zadania są zawsze uruchamiane w tej samej kolejności, w jakiej zostały dodane”.

Zasadniczo istnieją trzy sposoby współbieżności w systemie iOS:

  • wątki
  • kolejki wysyłkowe
  • kolejki operacji

„Wadą wątków jest to, że przenoszą ciężar tworzenia skalowalnego rozwiązania na programistę. Musisz zdecydować, ile wątków utworzyć i dynamicznie dostosowywać tę liczbę, gdy zmieniają się warunki. Ponadto aplikacja przejmuje na siebie większość kosztów związanych z tworzeniem i utrzymywaniem wątków, z których korzysta.”

NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                       selector:@selector(myThreadMainMethod:)
                                       object:nil];
[myThread start];

„A DispatchQueueto warstwa abstrakcji na górze kolejki GCD, która umożliwia wykonywanie zadań asynchronicznie i współbieżnie w aplikacji. Zadania są zawsze wykonywane w kolejności, w jakiej zostały dodane do kolejki”.

Kolejka szeregowa i kolejka współbieżna

„Szeregowa kolejka wysyłkowa wykonuje w danym momencie tylko jedno zadanie. Kolejki szeregowe są często używane do synchronizacji dostępu do określonej wartości lub zasobu, aby zapobiec wyścigom danych”.

let serialQueue = DispatchQueue(label: "serialQueue")

serialQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
serialQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 1 finished
Task 2 started
Task 2 finished

let concurrentQueue = DispatchQueue(label: "concurrentQueue", 
                                    attributes: .concurrent)

concurrentQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
concurrentQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 2 started
Task 1 finished
Task 2 finished

„Kolejka operacji jest odpowiednikiem Cocoa współbieżnej kolejki wysyłkowej i jest implementowana przez klasę NSOperationQueue. W przeciwieństwie do kolejek wysyłkowych, kolejki operacyjne nie ograniczają się do wykonywania zadań w kolejności FIFO i wspierają tworzenie złożonych wykresów kolejności wykonywania dla Twoich zadań”.

NSOperationQueue* myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperation:anOperation]; 
[myQueue addOperationWithBlock:^{
   /* Do something. */
}];

Główna kolejka dyspozytorska to dostępna globalnie kolejka szeregowa wykonująca zadania w głównym wątku aplikacji.

„Możesz zacząć wykonywać ciężkie zadania w kolejce w tle i odesłać z powrotem do kolejki głównej, kiedy skończysz”.

DispatchQueue.main.async {
    self.tableView.reloadData()
}

Miłego kodowania…