W Swift 2 udało mi się utworzyć kolejkę z następującym kodem:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Ale nie kompiluje się w Swift 3.
Jaki jest preferowany sposób napisania tego w Swift 3?
ios
swift3
xcode8
grand-central-dispatch
dispatch-after
Karthik Kumar
źródło
źródło
DispatchQueue(label: "your-label")
kolejki szeregowej. Wszystkie dodatkowe parametry mają wartości domyślne.Odpowiedzi:
Tworzenie współbieżnej kolejki
Utwórz kolejkę szeregową
Uzyskaj główną kolejkę asynchronicznie
Synchronizuj główną kolejkę
Aby uzyskać jeden z wątków w tle
Xcode 8.2 beta 2:
Aby uzyskać jeden z wątków w tle
Jeśli chcesz się dowiedzieć o korzystaniu z tych kolejek. Zobacz tę odpowiedź
źródło
attributes: .serial
podczas tworzenia kolejki seryjny:let serialQueue = DispatchQueue(label: "queuename")
.Kompiluje poniżej> = Swift 3 . Ten przykład zawiera większość potrzebnej nam składni.
QoS - nowa składnia jakości usług
weak self
- zakłócać zachowanie cyklijeśli jaźń nie jest dostępna, nie rób nic
async global utility queue
- dla zapytania sieciowego nie czeka na wynik, jest to kolejka współbieżna, blok (zwykle) nie czeka po uruchomieniu. Wyjątkiem dla współbieżnej kolejki może być, gdy wcześniej osiągnięty został limit zadań, kolejka tymczasowo zamienia się w kolejkę szeregową i czeka, aż jakieś poprzednie zadanie w tej kolejce się zakończy.async main queue
- za dotknięcie interfejsu użytkownika blok nie czeka na wynik, ale czeka na swój slot na początku. Główna kolejka jest kolejką szeregową.Oczywiście musisz dodać trochę sprawdzania błędów do tego ...
źródło
guard
, żeself
nie jestnil
na górze, tak że żaden z kodu jest wykonywany, jeśli jestnil
npguard strongSelf = self else { return }
..global(qos: .background)
do We / Wy (żądanie sieciowe). Użyj.global(qos: .default)
lub.global(qos: .utility)
zamiast.Skompilowany w XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
źródło
Ponieważ odpowiedź na pytanie OP została już udzielona powyżej, chciałbym dodać kilka uwag dotyczących prędkości:
To robi dużą różnicę, jaką klasę priorytetu przypisujesz do funkcji asynchronicznej w DispatchQueue.global .
Nie polecam uruchamiania zadań za pomocą .background priorytetem wątku szczególnie na iPhonie X, gdzie zadanie wydaje się być przydzielone do rdzeni o niskiej mocy.
Oto kilka rzeczywistych danych z funkcji intensywnie obliczeniowej, która czyta z pliku XML (z buforowaniem) i wykonuje interpolację danych:
Nazwa urządzenia / .background / .utility / .default / .userInitiated / .userInteractive
Pamiętaj, że zestaw danych nie jest taki sam dla wszystkich urządzeń. Jest to największy na iPhone X i najmniejszy na iPhone 5s.
źródło
Zrobiłem to i jest to szczególnie ważne, jeśli chcesz odświeżyć interfejs użytkownika, aby wyświetlać nowe dane bez zauważania przez użytkownika, jak w UITableView lub UIPickerView.
źródło
// użyj kolejki operacji, jeśli chcesz zapełnić obiekty (etykiety, widok obrazu, widok tekstu) w kontrolerze widoku
źródło
Przeprojektowałem twój kod w Xcode 8, Swift 3, a zmiany są zaznaczone w przeciwieństwie do twojej wersji Swift 2.
źródło
Szybki 3
chcesz wywołać zamknięcie w szybkim kodzie, a następnie chcesz zmienić w scenorysie, a dowolny typ zmiany należy do widoku, aplikacja się zawiesi
ale chcesz użyć metody wysyłki, aplikacja nie ulegnie awarii
metoda asynchroniczna
metoda synchronizacji
źródło
DispatchQueue.main.sync
Kolejka szeregowa:
Współbieżna kolejka:
źródło
Dla Swift 3
źródło
źródło
Aktualizacja do szybkiego 5
Z dokumentacji Apple :
Parametry
etykieta
Etykieta ciągów, którą należy dołączyć do kolejki, aby jednoznacznie zidentyfikować ją w narzędziach do debugowania, takich jak Instrumenty, próbki, stackshoty i raporty o awariach. Ponieważ wszystkie aplikacje, biblioteki i frameworki mogą tworzyć własne kolejki wysyłki, zaleca się styl nazewnictwa DNS odwrotny (com.example.myqueue). Ten parametr jest opcjonalny i może mieć wartość NULL.
qos
Poziom jakości usług do powiązania z kolejką. Ta wartość określa priorytet, z jakim system planuje zadania do wykonania. Aby uzyskać listę możliwych wartości, zobacz DispatchQoS.QoSClass.
atrybuty
Atrybuty do skojarzenia z kolejką. Dołącz atrybut współbieżny, aby utworzyć kolejkę wysyłkową, która wykonuje zadania jednocześnie. W przypadku pominięcia tego atrybutu kolejka wysyłkowa wykonuje zadania szeregowo.
autoreleaseFrequency
Częstotliwość automatycznego wydawania obiektów utworzonych przez bloki planowane przez kolejkę. Aby uzyskać listę możliwych wartości, zobacz DispatchQueue.AutoreleaseFrequency .
cel
Kolejka docelowa, w której mają być wykonywane bloki. Podaj DISPATCH_TARGET_QUEUE_DEFAULT, jeśli chcesz, aby system udostępniał kolejkę odpowiednią dla bieżącego obiektu.
źródło
teraz jest to po prostu:
wartość domyślna to serial, aby uzyskać współbieżność, użyj opcjonalnego argumentu atrybuty .concurrent
źródło
seiralQueue.async {}
. @tylemolźródło
Możesz utworzyć kolejkę wysyłki, używając tego kodu w swift 3.0
źródło