In Swift 2 konnte ich eine Warteschlange mit folgendem Code erstellen:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Dies wird jedoch in Swift 3 nicht kompiliert.
Was ist die bevorzugte Methode, um dies in Swift 3 zu schreiben?
ios
swift3
xcode8
grand-central-dispatch
dispatch-after
Karthik Kumar
quelle
quelle
DispatchQueue(label: "your-label")
für eine serielle Warteschlange zu verwenden. Die zusätzlichen Parameter haben alle Standardwerte.Antworten:
Erstellen einer gleichzeitigen Warteschlange
Erstellen Sie eine serielle Warteschlange
Hauptwarteschlange asynchron abrufen
Hauptwarteschlange synchron abrufen
Um einen der Hintergrund-Threads zu erhalten
Xcode 8.2 Beta 2:
Um einen der Hintergrund-Threads zu erhalten
Wenn Sie mehr über die Verwendung dieser Warteschlangen erfahren möchten, lesen Sie diese Antwort
quelle
attributes: .serial
beim Erstellen einer seriellen Warteschlange tatsächlich weglassen :let serialQueue = DispatchQueue(label: "queuename")
.Kompiliert unter> = Swift 3 . Dieses Beispiel enthält den größten Teil der Syntax, die wir benötigen.
QoS - neue Syntax für Servicequalität
weak self
- Haltezyklen zu unterbrechenWenn Selbst nicht verfügbar ist, tun Sie nichts
async global utility queue
- Bei Netzwerkabfragen wird nicht auf das Ergebnis gewartet, es handelt sich um eine gleichzeitige Warteschlange. Der Block wartet (normalerweise) nicht beim Start. Eine Ausnahme für eine gleichzeitige Warteschlange könnte sein, dass die Warteschlange, wenn ihr Aufgabenlimit zuvor erreicht wurde, vorübergehend in eine serielle Warteschlange umgewandelt wird und wartet, bis eine vorherige Aufgabe in dieser Warteschlange abgeschlossen ist.async main queue
- Zum Berühren der Benutzeroberfläche wartet der Block nicht auf das Ergebnis, sondern zu Beginn auf seinen Steckplatz. Die Hauptwarteschlange ist eine serielle Warteschlange.Natürlich müssen Sie hier einige Fehlerprüfungen hinzufügen ...
quelle
guard
dass diesself
nichtnil
oben steht, so dass keiner der Codes ausgeführt wird, wenn esnil
zguard strongSelf = self else { return }
..global(qos: .background)
für E / A (Netzwerkanforderung) verwenden. Verwenden Sie.global(qos: .default)
oder.global(qos: .utility)
stattdessen.Kompiliert in XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
quelle
Da die OP-Frage bereits oben beantwortet wurde, möchte ich nur einige Überlegungen zur Geschwindigkeit hinzufügen:
Es macht einen großen Unterschied, welche Prioritätsklasse Sie Ihrer asynchronen Funktion in DispatchQueue.global zuweisen .
Ich empfehle nicht, Aufgaben mit der Priorität .background thread auszuführen, insbesondere auf dem iPhone X, wo die Aufgabe auf den Kernen mit geringem Stromverbrauch zugewiesen zu sein scheint.
Hier sind einige reale Daten aus einer rechenintensiven Funktion, die aus einer XML-Datei (mit Pufferung) liest und Dateninterpolation durchführt:
Gerätename / .background / .utility / .default / .userInitiated / .userInteractive
Beachten Sie, dass der Datensatz nicht für alle Geräte gleich ist. Es ist das größte auf dem iPhone X und das kleinste auf dem iPhone 5s.
quelle
Ich habe dies getan und dies ist besonders wichtig, wenn Sie Ihre Benutzeroberfläche aktualisieren möchten, um neue Daten anzuzeigen, ohne dass der Benutzer dies wie in UITableView oder UIPickerView bemerkt.
quelle
// Verwenden Sie die Operationswarteschlange, wenn Sie die Objekte (Beschriftungen, Bildansicht, Textansicht) auf Ihrem Viewcontroller füllen müssen
quelle
Ich habe Ihren Code in Xcode 8, Swift 3 überarbeitet und die Änderungen sind im Gegensatz zu Ihrer Swift 2-Version markiert.
quelle
Swift 3
Wenn Sie einen Abschluss in schnellem Code aufrufen möchten, möchten Sie ihn im Storyboard ändern. Jede Art von Änderung gehört zur Ansicht, dass Ihre Anwendung abstürzt
Wenn Sie jedoch die Versandmethode verwenden möchten, stürzt Ihre Anwendung nicht ab
asynchrone Methode
Synchronisierungsmethode
quelle
DispatchQueue.main.sync
Serielle Warteschlange:
Gleichzeitige Warteschlange:
quelle
Für Swift 3
quelle
quelle
Update für Swift 5
Aus der Apple-Dokumentation :
Parameter
Etikette
Eine Zeichenfolgenbezeichnung, die an die Warteschlange angehängt werden soll, um sie in Debugging-Tools wie Instruments, Sample, Stackshots und Absturzberichten eindeutig zu identifizieren. Da Anwendungen, Bibliotheken und Frameworks ihre eigenen Versandwarteschlangen erstellen können, wird ein Reverse-DNS-Benennungsstil (com.example.myqueue) empfohlen. Dieser Parameter ist optional und kann NULL sein.
qos
Das Quality-of-Service-Level, das der Warteschlange zugeordnet werden soll. Dieser Wert bestimmt die Priorität, mit der das System Aufgaben für die Ausführung plant. Eine Liste möglicher Werte finden Sie unter DispatchQoS.QoSClass.
Attribute
Die Attribute, die der Warteschlange zugeordnet werden sollen. Fügen Sie das Attribut concurrent hinzu, um eine Versandwarteschlange zu erstellen, in der Aufgaben gleichzeitig ausgeführt werden. Wenn Sie dieses Attribut weglassen, führt die Versandwarteschlange Aufgaben seriell aus.
AutoreleaseFrequency
Die Häufigkeit, mit der Objekte, die von den von der Warteschlange geplanten Blöcken erstellt wurden, automatisch freigegeben werden. Eine Liste möglicher Werte finden Sie unter DispatchQueue.AutoreleaseFrequency .
Ziel
Die Zielwarteschlange, in der Blöcke ausgeführt werden sollen. Geben Sie DISPATCH_TARGET_QUEUE_DEFAULT an, wenn das System eine Warteschlange bereitstellen soll, die für das aktuelle Objekt geeignet ist.
quelle
es ist jetzt einfach:
Der Standardwert ist seriell. Um gleichzeitig zu werden, verwenden Sie das optionale Attributargument .concurrent
quelle
seiralQueue.async {}
. @ Tylemolquelle
Mit diesem Code können Sie in Swift 3.0 eine Versandwarteschlange erstellen
quelle