Jak mogę dispatch_sync, dispatch_async, dispatch_after itp. W Swift 3, Swift 4 i nowszych wersjach?

248
rickster 2016-06-14 14:58.

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 takie rzeczy, 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 projekt w Xcode 8 (beta) dla Swift 3, otrzymuję różnego rodzaju błędy. Niektóre z nich oferują naprawienie mojego kodu, ale nie wszystkie poprawki generują działający kod. Co mam z tym zrobić?

6 answers

345
rickster 2016-06-14 14:58.

Od samego początku Swift zapewniał pewne udogodnienia, dzięki którym ObjC i C były bardziej Swifty, dodając więcej z każdą wersją. Teraz, w Swift 3, nowa funkcja „importuj jako element członkowski” pozwala frameworkom z określonymi 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 razie potrzeby stać się podtypami.

W Xcode 8 / Swift 3 beta, Apple zastosowało tę funkcję (wraz z kilkoma innymi), aby uczynić framework Dispatch znacznie bardziej Swifty. (A także Core Graphics .) Jeśli śledzisz wysiłki Swift 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. Spowoduje to zastosowanie (za Twoją weryfikacją i zatwierdzeniem) wszystkie zmiany potrzebne jednocześnie dla wszystkich interfejsów API o zmienionych nazwach 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 może nie obsługiwać wszystkiego prawidłowo.)

W rezultacie typowy wzorzec odbijania pracy w tło iz powrotem wygląda teraz następująco:

// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    DispatchQueue.main.async {
        self.imageView.image = image
    }
}

Zauważ, że używamy .userInitiatedzamiast jednej ze starych DISPATCH_QUEUE_PRIORITYstałych. Specyfikatory Quality of Service (QoS) zostały wprowadzone w OS X 10.10 / iOS 8.0, zapewniając systemowi bardziej przejrzysty sposób nadawania priorytetów pracy i wycofując stare specyfikatory priorytetów. Szczegółowe informacje można znaleźć w dokumentacji firmy Apple dotyczącej pracy w tle i efektywności energetycznej .

Nawiasem mówiąc, jeśli utrzymujesz własne kolejki w celu zorganizowania pracy, sposób ich uzyskania wygląda teraz następująco (zwróć uwagę, że DispatchQueueAttributesto jest OptionSet, więc używasz literałów w stylu kolekcji do łączenia opcji):

class Foo { 
    let queue = DispatchQueue(label: "com.example.my-serial-queue",
                           attributes: [.serial, .qosUtility])
    func doStuff() {
        queue.async {
            print("Hello World")
        }
    }
}

Używasz dispatch_afterdo późniejszej pracy? Jest to metoda również w przypadku kolejek i wymaga a DispatchTime, która ma operatory dla różnych typów liczbowych, więc możesz po prostu dodać całe lub ułamkowe sekundy:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
    print("Are we there yet?")
}

Możesz poruszać się po nowym interfejsie API Dispatch, otwierając jego interfejs w Xcode 8 - użyj opcji Otwórz szybko, aby znaleźć moduł Dispatch, lub umieść symbol (taki jak DispatchQueue) w swoim projekcie / placu zabaw Swift i kliknij go za pomocą polecenia, a następnie obejrzyj moduł stamtąd. ( Interfejs API Swift Dispatch można znaleźć w nowej witrynie Apple Reference API i przeglądarce dokumentów w formacie Xcode, ale wygląda na to, że treść dokumentu z wersji C jeszcze się do niego nie przeniesiono).

Więcej wskazówek znajdziesz w Przewodniku po migracji .

142
ingconti 2016-08-13 22:54.

W Xcode 8 beta 4 nie działa ...

Posługiwać się:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    print("Are we there yet?")
}

dla asynchronii na dwa sposoby:

DispatchQueue.main.async {
    print("Async1")
}

DispatchQueue.main.async( execute: {
    print("Async2")
})
72
S. Matsepura 2017-03-02 02:02.

Ten jest dobrym przykładem na Swift 4temat async:

DispatchQueue.global(qos: .background).async {
    // Background Thread
    DispatchQueue.main.async {
        // Run UI Updates or call completion block
    }
}
40
Marco 2016-10-10 06:07.

w Xcode 8 użyj:

DispatchQueue.global(qos: .userInitiated).async { }
30
Saranjith 2017-10-18 01:41.

Swift 5.2, 4 i nowsze

Kolejki główne i kolejki w tle

let main = DispatchQueue.main
let background = DispatchQueue.global()
let helper = DispatchQueue(label: "another_thread") 

Praca z wątkami asynchronicznymi i synchronizującymi !

 background.async { //async tasks here } 
 background.sync { //sync tasks here } 

Wątki asynchroniczne będą działać razem z wątkiem głównym.

Wątki synchronizacji będą blokować główny wątek podczas wykonywania.

13
Gurjinder Singh 2018-09-14 07:59.

Swift 4.1 i 5. W naszym kodzie używamy kolejek w wielu miejscach. Stworzyłem więc klasę Threads ze wszystkimi kolejkami. Jeśli nie chcesz używać klasy Threads, możesz skopiować żądany kod kolejki z metod klas.

class Threads {

  static let concurrentQueue = DispatchQueue(label: "AppNameConcurrentQueue", attributes: .concurrent)
  static let serialQueue = DispatchQueue(label: "AppNameSerialQueue")

  // Main Queue
  class func performTaskInMainQueue(task: @escaping ()->()) {
    DispatchQueue.main.async {
      task()
    }
  }

  // Background Queue
  class func performTaskInBackground(task:@escaping () throws -> ()) {
    DispatchQueue.global(qos: .background).async {
      do {
        try task()
      } catch let error as NSError {
        print("error in background thread:\(error.localizedDescription)")
      }
    }
  }

  // Concurrent Queue
  class func perfromTaskInConcurrentQueue(task:@escaping () throws -> ()) {
    concurrentQueue.async {
      do {
        try task()
      } catch let error as NSError {
        print("error in Concurrent Queue:\(error.localizedDescription)")
      }
    }
  }

  // Serial Queue
  class func perfromTaskInSerialQueue(task:@escaping () throws -> ()) {
    serialQueue.async {
      do {
        try task()
      } catch let error as NSError {
        print("error in Serial Queue:\(error.localizedDescription)")
      }
    }
  }

  // Perform task afterDelay
  class func performTaskAfterDealy(_ timeInteval: TimeInterval, _ task:@escaping () -> ()) {
    DispatchQueue.main.asyncAfter(deadline: (.now() + timeInteval)) {
      task()
    }
  }
}

Przykład pokazujący użycie głównej kolejki.

override func viewDidLoad() {
    super.viewDidLoad()
     Threads.performTaskInMainQueue {
        //Update UI
    }
}

MORE COOL STUFF

Jana Duggar: Wszystko, co powiedziała o miłości i jej 5-letnie okno na znalezienie „jednego”

Jana Duggar: Wszystko, co powiedziała o miłości i jej 5-letnie okno na znalezienie „jednego”

Jana Duggar otwarcie mówiła o swoich poszukiwaniach miłości. Oto wszystko, co powiedziała na ten temat i jej pięcioletnie okno na małżeństwo.

Sam Heughan dokładnie wie, co weźmie z zestawu „Outlander” - „Czuję się, jakbym był Jamiem, kiedy je zakładam”

Sam Heughan dokładnie wie, co weźmie z zestawu „Outlander” - „Czuję się, jakbym był Jamiem, kiedy je zakładam”

Gwiazda „Outlandera”, Sam Heughan, niedawno ujawnił, co zabierze z planu, aby upamiętnić Jamiego Frasera, rolę, która uczyniła go gwiazdą.

Piosenka wczesnych Beatlesów, która była jednym z „najbardziej ekscytujących występów” zespołu, według Insidera Fab Four

Piosenka wczesnych Beatlesów, która była jednym z „najbardziej ekscytujących występów” zespołu, według Insidera Fab Four

„She Loves You” została napisana w godzinę, nagrana w jeden dzień i była piosenką The Beatles z jednym z ich najlepszych wykonań w karierze.

Dolly Parton pomogła swojej „inwalidzkiej” babci, gdy żadne inne wnuki by tego nie zrobiły - ona też zrobiła jej psikusa

Dolly Parton pomogła swojej „inwalidzkiej” babci, gdy żadne inne wnuki by tego nie zrobiły - ona też zrobiła jej psikusa

Dolly Parton i jej babcia Bessie miały szczególny związek. Babcia Parton była bardzo chora, ale to nie powstrzymało Dolly przed zrobieniem jej psikusa.

Jakie jest najtwardsze drewno na świecie?

Jakie jest najtwardsze drewno na świecie?

Można by pomyśleć, że dąb lub hikora są wytrzymałe, ale jeśli chodzi o najtwardsze drewno na świecie, to nawet się do nich nie zbliżają.

10 najstraszniejszych stworzeń morskich kryjących się w głębinach oceanu

10 najstraszniejszych stworzeń morskich kryjących się w głębinach oceanu

Ocean jest pełen piękna, ale kryje też jedne z najstraszniejszych stworzeń morskich na świecie. Wiele z nich czai się głęboko pod powierzchnią oceanu, w mrocznym, podciśnieniowym świecie głębin morskich.

10 najlepszych zaklęć miecza w grze Minecraft

10 najlepszych zaklęć miecza w grze Minecraft

Jeśli walczysz z wrogimi mobami lub przygotowujesz się do scenariuszy PvP, znajomość najlepszych zaklęć miecza w Minecrafcie może dać ci znaczną przewagę. Zaklinanie mieczy pozwala zadawać większe obrażenia, zwiększać liczbę przedmiotów wypadających z potworów i wydłużać trwałość miecza.

13 krajów socjalistycznych, które wyglądają zupełnie inaczej

13 krajów socjalistycznych, które wyglądają zupełnie inaczej

Kiedy ludzie mówią o krajach socjalistycznych, często wyobrażają sobie pełną kontrolę rządu i brak własności prywatnej. Jednak w praktyce gospodarki socjalistyczne są bardzo zróżnicowane.

Podsumowanie Niedźwiedzia: Czy Marcus jest najmilszym, najłagodniejszym i najszczerszym mężczyzną w Chicago?

Podsumowanie Niedźwiedzia: Czy Marcus jest najmilszym, najłagodniejszym i najszczerszym mężczyzną w Chicago?

W „Children” pojawia się epizod ze znanym nazwiskiem i kilka druzgocących wiadomości

Czy za 9800 dolarów „zapakowałbyś ich” do tej siedmiomiejscowej Toyoty RAV4 z 2008 roku?

Czy za 9800 dolarów „zapakowałbyś ich” do tej siedmiomiejscowej Toyoty RAV4 z 2008 roku?

Uważa się, że ten RAV4 jest w doskonałym stanie i jest przygotowany do gry w muzyczne krzesła.

Furgonetka dostawcza Amazon zapala się w wyniku ognistej eksplozji podczas letnich upałów w Houston

Furgonetka dostawcza Amazon zapala się w wyniku ognistej eksplozji podczas letnich upałów w Houston

Na nagraniu z drona uchwycono strażaków, którzy najwyraźniej walczyli o ugaszenie pożaru.

Marvel's Black Panther Show będzie najważniejszym serialem animowanym w historii

Marvel's Black Panther Show będzie najważniejszym serialem animowanym w historii

Eyes of Wakanda jest bezpośrednio powiązany z MCU, a także aktualizacje X-Men '97, What If..., Daredevil i nie tylko.

Aktorzy serialu Laguna Beach: Gdzie są teraz?

Aktorzy serialu Laguna Beach: Gdzie są teraz?

„Laguna Beach” opowiadało o życiu licealistów Lauren Conrad, Kristin Cavallari, Stephena Collettiego i innych w połowie lat 2000. Oto, gdzie obecnie znajdują się członkowie obsady reality show MTV.

Historia randek Avy Gardner: spojrzenie wstecz na małżeństwa i romanse ikony Hollywood

Historia randek Avy Gardner: spojrzenie wstecz na małżeństwa i romanse ikony Hollywood

Ava Gardner była żoną Mickeya Rooneya i Franka Sintry, a także spotykała się z kilkoma innymi gwiazdami Hollywood. Oto spojrzenie wstecz na historię randek Avy Gardner.

Kim jest żona Johna Cleese'a? Wszystko o Jennifer Wade

Kim jest żona Johna Cleese'a? Wszystko o Jennifer Wade

John Cleese poślubił swoją żonę Jennifer Wade w 2012 roku. Oto wszystko, co warto wiedzieć o żonie Johna Cleese'a, Jennifer Wade.

Posiadłość Kim Zolciak-Biermann i Kroy Biermann List w Gruzji na sprzedaż w Splicie

Posiadłość Kim Zolciak-Biermann i Kroy Biermann List w Gruzji na sprzedaż w Splicie

Gwiazda „Prawdziwych gospodyń domowych z Atlanty” i jej były mąż, zawodowy zawodnik NFL, po raz pierwszy kupili rozległą rezydencję Alpharetta w 2012 roku.

zaimki są bardzo przerażające

Uderzyło mnie to nagle, jak to często bywa. Znowu jest w połowie <Nie, nie ten w Pacyfiku, bordowy, ten na karnawale> Każdy nagłówek jest głośny…..

3 sprawdzone sposoby na poprawę umiejętności pisania

Korzyści płynące z pisania i strategie, które Ci w tym pomogą

3 sprawdzone sposoby na poprawę umiejętności pisania

W 2022 roku, wraz z wydaniem GPT-3, umiejętność pisania wydaje się tracić na znaczeniu. Dzięki sztucznej inteligencji osoby o słabym pisaniu mogą również generować wysokiej jakości personel.

Powolna erozja: ujawnianie sposobów, w jakie ludzie marnują swoje kariery

Powolna erozja: ujawnianie sposobów, w jakie ludzie marnują swoje kariery

W dzisiejszym dynamicznym i konkurencyjnym świecie kariera odgrywa znaczącą rolę w rozwoju osobistym, stabilności finansowej i ogólnej satysfakcji z życia. Jednak wiele osób wpada w nieustający cykl stagnacji i niezadowolenia, stopniowo marnując swoje życie zawodowe.

Co wpływa na podcast?

Co wpływa na podcast?

W zeszłym tygodniu zauważyłem komunikat prasowy, wysłany za pośrednictwem PressGazette (brytyjski serwis informacyjny). W artykule ogłoszono, że Acast, skandynawska firma hostingowa i reklamowa podcastów, będzie przewodzić konsorcjum „prawdopodobnie najbardziej wpływowych” wydawców podcastów.

Language