19

Jaki jest najlepszy sposób wielowątkowości w systemie iOS, ponieważ mamy trzy opcje GCD, NSThread i NSOperationQueue? Jestem zdezorientowany, w którym jest najlepszy? Jeśli nie ma, to które powinno być używane w jakim scenariuszu i jak się różnią, a także, jeśli ktoś ma jakiś dobry przykład użycia NSOperationQueue, proszę udostępnij, abym mógł się uczyć.Który jest najlepszy z GCD, NSThread lub NSOperationQueue?

+1

Zdefiniuj "najlepsze". Najszybszy, najlżejszy, najłatwiejszy w użyciu? – CodaFi

+0

Jest to pytanie niewymienialne, chyba że masz na myśli konkretny przypadek użycia. Nie ma generycznych "najlepszych" spośród tych trzech. – jrturton

Odpowiedz

35

Prosta odpowiedź:

  1. Zastosowanie NSThread (lub nawet pthreads API), kiedy chcesz lub musisz mieć bezpośrednią kontrolę nad wątków utworzonych, np potrzebujesz precyzyjnej kontroli nad priorytetami wątku lub współpracujesz z innym podsystemem, który sprzedaje/zużywa obiekty wątku bezpośrednio i musisz pozostać na tej samej stronie z nim. Takie przypadki są rzadkie, ale występują, szczególnie w aplikacjach czasu rzeczywistego.

  2. Skorzystaj z GCD, gdy twoje zadanie nadaje się dobrze do prostej równoległości, np. po prostu chcesz rzucić trochę pracy "w tle" z bardzo małą ilością dodatkowej pracy, masz pewne struktury danych, które chcesz tylko serializować (i kolejki szeregowe są świetne do robienia tego w sposób bez blokady), masz trochę za pętle, które mogłyby się dobrze zrównoleglić z dispatch_apply(), masz trochę źródeł danych/timerów, które API źródeł GCD pozwoli ci łatwo poradzić sobie z tłem itp. GCD jest dość potężny i możesz go używać na wiele więcej niż to, ale są to względne scenariusze "bez myślenia", w których nie chcesz być pochłonięty przez zadania inicjowania i konfigurowania, a jedynie "rób podstawowe rzeczy równolegle".

  3. Użyj NSOperation, gdy jesteś już na warstwie API Cocoa (w porównaniu do pisania w prostym C do POSIX API) i masz bardziej złożone operacje, które chcesz zrównoleglić. NSOperation pozwala na podklasy, arbitralnie złożone wykresy zależności, anulowanie i obsługuje wiele innych semantyków wyższego poziomu, które mogą ci się przydać. NSOperation w rzeczywistości używa GCD pod okładkami, więc jest tak samo wielordzeniowe, wielowątkowe, jak GCD, choć zapewnia również strukturę Foundation, więc jeśli hakujesz w warstwie POSIX, prawdopodobnie chcesz użyć Opcja 2.

Jak powiedzieli inni, wszystko zależy od tego, co próbujesz zrobić, więc nie ma jednej, a nawet uniwersalnie poprawnej odpowiedzi na twoje pytanie.

+1

KUdos, ... @ jkh ...... to jest to, co chciałem wiedzieć. Teraz jest ktoś, z kim mogę dyskutować. Okay, więc powiedziałeś o punkcie 2, aktualnie używam 2. Ale myślałem, czy mogę ustawić priorytet wątku w czasie wykonywania na podstawie czasu, jaki zajmuje inny wątek lub kolejka. Załóżmy, że wątek trwa dłużej niż 3 minuty, chcę obniżyć jego priorytet i zwiększyć priorytet drugiego. – Sumitiscreative

+0

Również, ponieważ mamy kolejkę dispatch_global w ios, które są z natury współbieżne. Kiedy przypisujemy do niego blok kodu. Czy to jest lepsze niż tworzenie nowej niestandardowej kolejki współbieżnej i dodawanie do niej bloków ??? lub to samo ??? czy możemy ustawić priorytet tych kolejek, które tworzymy? – Sumitiscreative

+2

Przed ustawieniem priorytetu wątku, pierwszym pytaniem, które należy zadać, jest "Dlaczego?"Wymieniłem aplikacje działające w czasie rzeczywistym (na przykład przetwarzanie audio i wideo), jako główny powód takiego działania, ponieważ rzadko jest to konieczne w inny sposób: GCD zapewnia 4 poziomy priorytetów w globalnych równoległych kolejkach (tło, niski, średni, wysokie), które są prawie zawsze wystarczające dla potrzeb aplikacji.Jeśli wątek trwa 3 minuty do zakończenia, ustawienie priorytetu nie pomoże - albo podziel go na mniejsze zadania, albo po prostu pozwól systemowi dynamicznie ustawiać priorytety dla długich wątków a krótkich -term (i będzie) – jkh

0

Ostatnio pochylam się w kierunku NSOperationQueue. To wykorzystuje wewnętrznie GCD i jest bezpieczne dla wątków, a także jest bardzo proste w użyciu.

+0

Ale można argumentować, że na pewno szybciej byłoby porzucić NSOperationQueue i po prostu obniżyć się do poziomu GCD. – CodaFi

+0

NSOperationQueue działa najlepiej, gdy zadania są dyskretne, synchroniczne i na żywo w tym samym wątku (np. Są bardziej lub mniej atomowe), kolejka może być używana jako podstawowa pula wątku w niemal każdej sytuacji. –

Powiązane problemy