Współbieżność z Grand Central Dispatch
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…

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































