Von Anfang an hat Swift einige Funktionen bereitgestellt, um ObjC und C schneller zu machen, und mit jeder Version mehr hinzugefügt. In Swift 3 ermöglicht die neue Funktion "Als Mitglied importieren" Frameworks mit bestimmten Stilen der C-API - wobei Sie einen Datentyp haben, der wie eine Klasse funktioniert, und eine Reihe globaler Funktionen, um damit zu arbeiten -. verhalten sich eher wie Swift-native APIs. Die Datentypen werden als Swift-Klassen importiert, die zugehörigen globalen Funktionen werden als Methoden und Eigenschaften für diese Klassen importiert, und einige verwandte Dinge wie Konstantensätze können gegebenenfalls zu Untertypen werden.
In der Beta-Version von Xcode 8 / Swift 3 hat Apple diese Funktion (zusammen mit einigen anderen) angewendet, um das Dispatch-Framework wesentlich schneller zu gestalten. (Und auch Core Graphics .) Wenn Sie die Open-Source-Bemühungen von Swift verfolgt haben, ist dies keine Neuigkeit , aber jetzt ist es das erste Mal, dass es Teil von Xcode ist.
Der erste Schritt zum Verschieben eines Projekts nach Swift 3 sollte darin bestehen, es in Xcode 8 zu öffnen und im Menü Bearbeiten> Konvertieren> In aktuelle Swift-Syntax ... zu wählen . Dies gilt (mit Ihrer Überprüfung und Genehmigung) für alle Änderungen auf einmal, die für alle umbenannten APIs und andere Änderungen erforderlich sind. (Oft ist eine Codezeile von mehr als einer dieser Änderungen gleichzeitig betroffen, sodass eine individuelle Reaktion auf Fehlerbehebungen möglicherweise nicht alles richtig macht.)
Das Ergebnis ist, dass das übliche Muster für das Abprallen von Arbeit in den Hintergrund und zurück jetzt folgendermaßen aussieht:
// 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
}
}
Beachten Sie, dass wir .userInitiated
anstelle einer der alten DISPATCH_QUEUE_PRIORITY
Konstanten verwenden. In OS X 10.10 / iOS 8.0 wurden QoS-Spezifizierer (Quality of Service) eingeführt, die dem System eine klarere Möglichkeit bieten, die Arbeit zu priorisieren und die alten Prioritätsspezifizierer zu verwerfen. Weitere Informationen finden Sie in den Apple- Dokumenten zu Hintergrundarbeiten und Energieeffizienz .
Übrigens, wenn Sie Ihre eigenen Warteschlangen behalten, um die Arbeit zu organisieren, sieht die Art und Weise, wie Sie eine erhalten, jetzt so aus (beachten Sie, dass dies DispatchQueueAttributes
eine ist OptionSet
, also verwenden Sie Literale im Sammlungsstil, um Optionen zu kombinieren):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Mit dispatch_after
späterer Arbeit zu tun? Dies ist auch eine Methode für Warteschlangen, und es ist eine Methode erforderlich, DispatchTime
die Operatoren für verschiedene numerische Typen enthält, sodass Sie nur ganze oder gebrochene Sekunden hinzufügen können:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Sie können sich in der neuen Versand-API zurechtfinden, indem Sie die Benutzeroberfläche in Xcode 8 öffnen. Verwenden Sie Schnell öffnen, um das Versandmodul zu finden, oder fügen Sie ein Symbol (wie DispatchQueue
) in Ihr Swift-Projekt / Ihren Spielplatz ein, klicken Sie bei gedrückter Befehlstaste darauf und stöbern Sie dann herum das Modul von dort. (Sie finden die Swift Dispatch- API auf Apples schicker neuer API-Referenzwebsite und im In-Xcode-Dokument-Viewer, aber es sieht so aus, als ob der Dokumentinhalt aus der C-Version noch nicht darin enthalten ist.)
Weitere Tipps finden Sie im Migrationshandbuch .