Mam pytanie dotyczące tego kodu
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* data = [NSData dataWithContentsOfURL:
kLatestKivaLoansURL];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES];
});
Pierwszy parametr tego kodu to
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
Czy pytamy ten kod o wykonywanie zadań szeregowych w globalnej kolejce, której sama definicja polega na tym, że zwraca globalną kolejkę współbieżną o danym poziomie priorytetu?
Jaka jest zaleta korzystania dispatch_get_global_queue
z głównej kolejki?
Jestem zdezorientowany. Czy możesz mi pomóc lepiej to zrozumieć.
objective-c
asynchronous
dispatch-async
użytkownik2332873
źródło
źródło
dispatch_get_global_queue
wnętrze różnego rodzajudispatch_queue_t myQueue
. Bardziej czytelne jest przekazywanie tylko myQueue do twojego `` dispatch_async``Odpowiedzi:
Głównym powodem używania kolejki domyślnej w kolejce głównej jest uruchamianie zadań w tle.
Na przykład, jeśli pobieram plik z Internetu i chcę zaktualizować użytkownika o postępie pobierania, uruchomię pobieranie w domyślnej kolejce priorytetowej i asynchronicznie zaktualizuję interfejs użytkownika w głównej kolejce.
źródło
0
oznaczaflags
parametr, który obecnie nie robi absolutnie nic. Z dokumentów:Flags that are reserved for future use. Always specify 0 for this parameter.
Wszystkie kolejki DISPATCH_QUEUE_PRIORITY_X są kolejkami równoczesnymi (co oznacza, że mogą wykonywać wiele zadań jednocześnie) i są FIFO w tym sensie, że zadania w danej kolejce zaczną być wykonywane w kolejności „pierwsze przyszło, pierwsze wyszło”. Jest to w porównaniu z kolejką główną (z dispatch_get_main_queue ()), która jest kolejką szeregową (zadania zaczną się kończyć i kończą się w kolejności, w jakiej zostały odebrane).
Tak więc, jeśli wyślesz 1000 bloków dispatch_async () do DISPATCH_QUEUE_PRIORITY_DEFAULT, zadania te zaczną być wykonywane w kolejności, w jakiej je wysłałeś do kolejki. Podobnie w przypadku kolejek WYSOKIE, NISKIE i TŁO. Wszystko, co wysyłasz do którejkolwiek z tych kolejek, jest wykonywane w tle w alternatywnych wątkach, z dala od głównego wątku aplikacji. Dlatego te kolejki są odpowiednie do wykonywania zadań, takich jak pobieranie w tle, kompresja, obliczenia itp.
Należy pamiętać, że kolejność wykonywania jest FIFO na podstawie kolejki. Jeśli więc wyślesz 1000 zadań dispatch_async () do czterech różnych równoczesnych kolejek, równomiernie je dzieląc i wysyłając do BACKGROUND, LOW, DEFAULT i HIGH w kolejności (tj. Planujesz ostatnie 250 zadań w kolejce HIGH), jest bardzo prawdopodobne, że pierwsze zadania, które zaczniesz, będą w tej kolejce WYSOKIEJ, ponieważ system przyjął twoją sugestię, że zadania te muszą dotrzeć do procesora tak szybko, jak to możliwe.
Zauważ też, że mówię „zacznie wykonywać w kolejności”, ale pamiętaj, że w przypadku równoczesnych kolejek rzeczy niekoniecznie kończą wykonywanie w kolejności, w zależności od długości czasu dla każdego zadania.
Zgodnie z Apple:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
Zasadniczo, jeśli wyślesz te 1000 bloków dispatch_async () do kolejki DEFAULT, HIGH, LOW lub BACKGROUND, wszystkie zaczną działać w kolejności, w jakiej je wysyłasz. Jednak krótsze zadania mogą zakończyć się przed dłuższymi. Powodem tego są dostępne rdzenie procesora lub bieżące zadania w kolejce wykonują obliczeniowo niewymagające intensywności prace (co sprawia, że system myśli, że może równolegle wykonywać dodatkowe zadania niezależnie od liczby rdzeni).
Poziom współbieżności jest w całości obsługiwany przez system i jest oparty na obciążeniu systemu i innych wewnętrznych czynnikach. To jest piękno Grand Central Dispatch (system dispatch_async ()) - po prostu tworzysz swoje jednostki robocze jako bloki kodu, ustawiasz dla nich priorytet (na podstawie wybranej przez ciebie kolejki) i pozwalasz systemowi zająć się resztą.
Tak więc, aby odpowiedzieć na powyższe pytanie: masz częściowo rację. „Pytasz ten kod” o wykonywanie równoczesnych zadań w globalnej kolejce współbieżnej na określonym poziomie priorytetu. Kod w bloku będzie wykonywany w tle, a każdy dodatkowy (podobny) kod będzie wykonywany potencjalnie równolegle, w zależności od oceny dostępnych zasobów przez system.
Z kolei „główna” kolejka (z dispatch_get_main_queue ()) jest kolejką szeregową (nie współbieżną). Zadania wysyłane do kolejki głównej będą zawsze wykonywane w kolejności i zawsze kończą się w kolejności. Te zadania będą również wykonywane w wątku interfejsu użytkownika, więc nadaje się do aktualizowania interfejsu użytkownika za pomocą komunikatów o postępach, powiadomień o zakończeniu itp.
źródło
Wersja szybka
To jest szybka wersja odpowiedzi Objective-C Davida. Za pomocą globalnej kolejki można uruchamiać rzeczy w tle, a kolejki głównej aktualizować interfejs użytkownika.
źródło