2017-05-31 2 views
0

Ich bin neu in Swift und versuche ein fertiges Projekt zu untersuchen. Aber da ist etwas, was ich nicht verstehen konnte.Warum benötigen Sie eine DispatchQueue, wenn Sie Swift Benachrichtigungen anzeigen?

Nachdem eine Netzwerkanforderung abgeschlossen wurde, zeigt die App unter einer Bedingung eine Warnung an.

Allerdings ist es mit einem DispatchQueue getan. Warum sollte jemand in dieser Situation DispatchQueue verwenden müssen.

+1

UI-Code muss immer in der Hauptwarteschlange erfolgen. – rmaddy

+0

und das Netzwerk wird (normalerweise) außerhalb des Hauptthreads erstellt. Versand sagt, dass der Code innerhalb muss zurück zum Haupt-Thread gehen – GIJOW

+0

https://www.quora.com/Why-Must-the-UI-always-be-updated-on-Main-Thread – JAL

Antwort

0

Es ist eine bewusste Design-Entscheidung von Apple Seite nicht haben UIKit Thread-sicher sein. Es thread-sicher zu machen, würde nicht viel in Bezug auf die Leistung kaufen; es würde tatsächlich viele Dinge langsamer machen. Und die Tatsache , dass UIKit an den Haupt-Thread gebunden ist, macht es sehr einfach gleichzeitige Programme zu schreiben und UIKit zu verwenden. Alles, was Sie tun müssen, ist sicherzustellen, , dass Anrufe in UIKit sind immer auf dem Haupt-Thread gemacht. So nach diesem die Tatsache, dass Objekte auf zugegriffen werden muss der Haupt-Thread ist eine Design-Entscheidung von Apple zugunsten der Leistung.

für ausführlichere Informationen, die Sie durch diesen Artikel gehen

https://www.objc.io/issues/2-concurrency/thread-safe-class-design/

In Ihrem Fall, Sie Alarm von einem anderen Thread zeigen, so dass Sie Code unter dem Mainthread so schreiben, können Sie bekommen der Haupt-Thread unter Verwendung von Code

DispatchQueue.main.async { 
     // Your UI Updation here 
    } 

Reason

In Cocoa Touch ist die UIApplication d. H. Die Instanz Ihrer Anwendung an den Hauptthread angehängt, da dieser Thread von UIApplicatioMain(), der Einstiegspunktfunktion von Cocoa Touch, erstellt wird. Sie richtet die Hauptereignisschleife einschließlich der Ausführungsschleife der Anwendung ein und beginnt mit der Verarbeitung von Ereignissen. Die Hauptereignisschleife der Anwendung empfängt alle UI-Ereignisse, z. B. Berührung, Gesten usw.

1

Sie werden sicher feststellen, dass der Alarm verzögert wird, wenn Sie die Warnung nicht im Hauptthread anzeigen, da der UI-Code immer in Ihrem Hauptthread ausgeführt werden muss.

Wenn Sie also einen Hintergrundthread verwenden und Code im Hauptthread ausführen möchten, müssen Sie async() anrufen. So rufen Sie DispatchQueue.main an, was der Hauptthread ist.

+0

Vielen Dank für die Antwort. Bei der Kommentierung des DispatchQueue.main-Teils konnte ich jedoch keinen Unterschied feststellen. – hackio

+0

Manchmal tut es @hackio, wenn es funktioniert und du es nicht auf dem Hauptthread ausführst, aktualisiere es und du wirst den Unterschied sehen. –

Verwandte Themen