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?
Odpowiedz
Prosta odpowiedź:
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.
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".
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.
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
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
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
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.
Ale można argumentować, że na pewno szybciej byłoby porzucić NSOperationQueue i po prostu obniżyć się do poziomu GCD. – CodaFi
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. –
- 1. NSThread vs. NSOperationQueue vs. ??? na iPhonie
- 2. Który z nich jest łatwiejszy w użyciu? GCD lub NSOperation?
- 3. dispatch_after equivalent w NSOperationQueue
- 4. NSThread z błędem _NSAutoreleaseNoPool
- 5. GCD z NSURLConnection
- 6. Czy można określić NSRunLoop/NSThread, który jest powiązany z otwartym NSStream?
- 7. Jak lekka jest funkcja NSOperationQueue w systemie Snow Leopard?
- 8. Problemy z GCD i KVO
- 9. Zawieszenie problemu z pytaniem GCD
- 10. Implementacje JPA - Który z nich jest najlepszy w użyciu?
- 11. Jaki jest najlepszy telefon z Androidem, który otrzymasz jako programista?
- 12. Korzystanie z NSThread sleep in a NSOperation
- 13. Co jest odpowiednikiem NSOperationQueue w java android?
- 14. NSThread i UIViewController interakcja
- 15. NSOperationQueue nie działa w IOS5
- 16. NSThread sleepfortimeinterval blokuje główny wątek
- 17. Numpy funkcja gcd
- 18. Wykonaj pętlę Next Run: Co jest nie tak z GCD?
- 19. , który jest najszybszym zapytaniem win32 lub SQL?
- 20. Który jest najlepszy sposób definiowania stałych w systemie Android, albo klasy statycznej, interfejsu lub zasobu xml?
- 21. Który jest najlepszy framework izolacji dla Java? JMock, Easymock, Mockito lub inny?
- 22. Który jest wydajny, itoa lub sprintf?
- 23. Który moduł dla Nginx jest najlepszy dla HTTP PUSH?
- 24. double lub float, który jest szybszy?
- 25. GCD dispatch_async i NSURLConnection
- 26. GCD i wywołania zwrotne - problem z współbieżnością
- 27. charAt() lub podłańcuch? Który jest szybszy?
- 28. Jak wstrzymać NSThread, aż do powiadomienia?
- 29. Który jest najlepszy sposób na ukrycie ostrzeżenia "nieużywana zmienna"
- 30. Uzyskiwanie bieżący DOM obiekt, który touchmove lub touchend jest ponad
Zdefiniuj "najlepsze". Najszybszy, najlżejszy, najłatwiejszy w użyciu? – CodaFi
Jest to pytanie niewymienialne, chyba że masz na myśli konkretny przypadek użycia. Nie ma generycznych "najlepszych" spośród tych trzech. – jrturton