Mam dużo kodu w projektach Swift 2.x (lub nawet 1.x), które wyglądają tak:
// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = image
}
}
Lub coś takiego, aby opóźnić wykonanie:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
print("test")
}
Lub wszelkie inne zastosowania API Grand Central Dispatch ...
Teraz, gdy otworzyłem swój projekt w Xcode 8 (beta) dla Swift 3, otrzymuję wszelkiego rodzaju błędy. Niektóre z nich oferują naprawę mojego kodu, ale nie wszystkie poprawki produkują działający kod. Co mam z tym zrobić?
Odpowiedzi:
Od samego początku Swift zapewnił pewne możliwości zwiększania Swifty w ObjC i C, dodając więcej z każdą wersją. Teraz, w Swift 3, nowa funkcja „importuj jako członka” pozwala frameworkom z niektórymi stylami C API - gdzie masz typ danych, który działa trochę jak klasa, i kilka globalnych funkcji do pracy z nim - działają bardziej jak natywne interfejsy API Swift. Typy danych są importowane jako klasy Swift, powiązane z nimi funkcje globalne są importowane jako metody i właściwości tych klas, a niektóre powiązane rzeczy, takie jak zestawy stałych, mogą w stosownych przypadkach stać się podtypami.
W Xcode 8 / Swift 3 beta Apple zastosował tę funkcję (wraz z kilkoma innymi), aby uczynić środowisko Dispatch znacznie bardziej Swifty. (A także Core Graphics .) Jeśli śledziłeś działania Swift typu open source, to nie jest nowość , ale teraz jest to pierwsza część Xcode.
Pierwszym krokiem na przeniesienie dowolnego projektu Swift 3 powinno być, aby otworzyć go w Xcode 8 i wybierz Edycja> Przekształć> do aktualnych Swift Składnia ... w menu. Dotyczy to (po sprawdzeniu i zatwierdzeniu) wszystkich zmian na raz wymaganych dla wszystkich przemianowanych interfejsów API i innych zmian. (Często na wiersz kodu wpływa więcej niż jedna z tych zmian naraz, więc reagowanie na naprawę błędu - jego osobno może nie wszystko poprawnie obsłużyć).
W rezultacie wspólny wzór odskakiwania do pracy w tle i wstecz wygląda teraz następująco:
Uwaga: używamy
.userInitiated
zamiast jednej ze starychDISPATCH_QUEUE_PRIORITY
stałych. Specyfikatory jakości usług (QoS) zostały wprowadzone w OS X 10.10 / iOS 8.0, zapewniając systemowi wyraźniejszy sposób ustalania priorytetów pracy i nieaktualne stare specyfikatory priorytetów. Szczegółowe informacje można znaleźć w dokumentach Apple na temat pracy w tle i efektywności energetycznej .Nawiasem mówiąc, jeśli trzymasz własne kolejki do organizowania pracy, sposób na uzyskanie kolejki wygląda teraz tak (zauważ, że
DispatchQueueAttributes
toOptionSet
, więc używasz literałów w stylu kolekcji do łączenia opcji):Używasz
dispatch_after
do pracy później? To także metoda kolejek, która wymagaDispatchTime
operatora, który ma operatory dla różnych typów liczbowych, dzięki czemu można po prostu dodać całe lub ułamkowe sekundy:Możesz obejść nowy interfejs API Dispatch, otwierając jego interfejs w Xcode 8 - użyj Otwórz szybko, aby znaleźć moduł Dispatch lub umieść symbol (podobny
DispatchQueue
) w swoim projekcie / placu zabaw Swift i kliknij go, a następnie przeciągnij się moduł stamtąd. ( Interfejs API Swift Dispatch można znaleźć w nowej, zwięzłej witrynie Apple Reference API i przeglądarce dokumentów w Xcode, ale wygląda na to, że zawartość dokumentów z wersji C jeszcze się do niej nie przeniesiła.)Więcej porad znajdziesz w Przewodniku migracji .
źródło
qos:
zamiastattributes:
myQueue.async {
wclass Foo
przykładzie?W Xcode 8 beta 4 nie działa ...
Posługiwać się:
dla asynchronizacji na dwa sposoby:
źródło
Ten jest dobrym przykładem na
Swift 4
okołoasync
:źródło
w Xcode 8 użyj:
źródło
Swift 5.2, 4 i późniejsze
Główne i tło kolejki
Praca z wątkami asynchronicznymi i synchronizującymi !
Wątki asynchroniczne będą działać razem z głównym wątkiem.
Synchronizacja wątków zablokuje główny wątek podczas wykonywania.
źródło
Swift 4.1 i 5. Używamy kolejek w wielu miejscach w naszym kodzie. Tak więc utworzyłem klasę wątków ze wszystkimi kolejkami. Jeśli nie chcesz używać klasy Threads, możesz skopiować żądany kod kolejki z metod klas.
Przykład pokazujący użycie kolejki głównej.
źródło