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 nicht in Swift 3 kompiliert.
Was ist der bevorzugte Weg, dies in Swift 3 zu schreiben?
Erstellen einer gleichzeitigen Warteschlange
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {
}
Erstellen Sie eine serielle Warteschlange
let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync {
}
Hauptwarteschlange asynchron abrufen
DispatchQueue.main.async {
}
Hauptwarteschlange synchron holen
DispatchQueue.main.sync {
}
So holen Sie sich einen der Hintergrundthreads
DispatchQueue.global(qos: .background).async {
}
Xcode 8.2 Beta 2:
So holen Sie sich einen der Hintergrundthreads
DispatchQueue.global(qos: .default).async {
}
DispatchQueue.global().async {
// qos' default value is ´DispatchQoS.QoSClass.default`
}
Wenn Sie mehr über die Verwendung dieser Warteschlangen erfahren möchten, lesen Sie diese Antwort
Kompiliert unter Swift. Dieses Beispiel enthält den größten Teil der von uns benötigten Syntax.
QoS - neue Quality of Service-Syntax
weak self
- Beibehaltungszyklen unterbrechen
wenn self nicht verfügbar ist, nichts tun
async global background queue
- für Netzwerkabfrage
async main queue
- zum Berühren der Benutzeroberfläche.
Natürlich müssen Sie eine Fehlerprüfung hinzufügen ...
DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in
guard let strongSelf = self else { return }
strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in
if error != nil {
print("error:\(error)")
} else {
DispatchQueue.main.async { () -> Void in
activityIndicator.removeFromSuperview()
strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
}
}
}
}
In XCode 8 kompiliert, Swift 3 https://github.com/rpthomas/Jedisware
@IBAction func tap(_ sender: AnyObject) {
let thisEmail = "emailaddress.com"
let thisPassword = "myPassword"
DispatchQueue.global(qos: .background).async {
// Validate user input
let result = self.validate(thisEmail, password: thisPassword)
// Go back to the main thread to update the UI
DispatchQueue.main.async {
if !result
{
self.displayFailureAlert()
}
}
}
}
Da die OP-Frage oben bereits beantwortet wurde, möchte ich nur einige Überlegungen zur Geschwindigkeit anstellen:
Es macht einen großen Unterschied, welche Prioritätsklasse Sie Ihrer asynchronen Funktion in DispatchQueue.global zuweisen.
Ich empfehle nicht, Aufgaben mit der Thread-Priorität . Background auszuführen, insbesondere auf dem iPhone X, bei dem die Aufgabe anscheinend auf den Kernen mit geringem Stromverbrauch zugewiesen ist.
Hier sind einige reale Daten aus einer rechenintensiven Funktion, die aus einer XML-Datei (mit Pufferung) liest und Dateninterpolation durchführt:
Gerätename/. Hintergrund/. Dienstprogramm/. Standard/. 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.
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 bemerkt, wie in UITableView oder UIPickerView.
DispatchQueue.main.async
{
/*Write your thread code here*/
}
DispatchQueue.main.async {
self.collectionView?.reloadData() // Depends if you were populating a collection view or table view
}
OperationQueue.main.addOperation {
self.lblGenre.text = self.movGenre
}
// Verwenden Sie Operation Queue, wenn Sie die Objekte (Beschriftungen, Bildansicht, Textansicht) auf Ihrem Viewcontroller füllen müssen
DispatchQueue.main.async(execute: {
// write code
})
Serienwarteschlange:
let serial = DispatchQueue(label: "Queuename")
serial.sync {
//Code Here
}
Gleichzeitige Warteschlange:
let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)
concurrent.sync {
//Code Here
}
let concurrentQueue = dispatch_queue_create("com.Swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version
let concurrentQueue = DispatchQueue(label:"com.Swift3.imageQueue", attributes: .concurrent) //Swift 3 version
Ich habe deinen Code in Xcode 8, Swift 3 überarbeitet und die Änderungen sind im Gegensatz zu deiner Swift 2-Version markiert.
Schnell 3
sie möchten eine Schließung in Swift-Code aufrufen und dann im Storyboard ändern, damit Ihre Anwendung abstürzt
wenn Sie jedoch die Versandmethode verwenden möchten, stürzt Ihre Anwendung nicht ab
asynchrone Methode
DispatchQueue.main.async
{
//Write code here
}
synchronisierungsmethode
DispatchQueue.main.sync
{
//Write code here
}
let newQueue = DispatchQueue(label: "newname")
newQueue.sync {
// your code
}
Für Swift 3
DispatchQueue.main.async {
// Write your code here
}
Update für Swift 5
Serielle Warteschlange
let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
// code to execute
}
Gleichzeitige Warteschlange
let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
concurrentQueue.async {
// code to execute
}
Von Apple-Dokumentation :
Parameter
label
Eine Zeichenfolgenbezeichnung, die an die Warteschlange angehängt wird, um sie in Debugging-Tools wie Instrumenten, Stichproben, Stackshots und Absturzberichten eindeutig zu identifizieren. Da alle Anwendungen, Bibliotheken und Frameworks ihre eigenen Versandwarteschlangen erstellen können, wird ein umgekehrter DNS-Namensstil (com.example.myqueue) empfohlen. Dieser Parameter ist optional und kann NULL sein.
qos
Die Servicequalität, die der Warteschlange zugeordnet werden soll. Dieser Wert bestimmt die Priorität, mit der das System Aufgaben zur Ausführung einplant. Eine Liste der möglichen 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 Dispatch-Warteschlange 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 der möglichen 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 für das aktuelle Objekt geeignete Warteschlange bereitstellen soll.