it-swarm.com.de

So erstellen Sie eine Versandwarteschlange in Swift 3

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?

385
user4790024

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

1089
LC 웃

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
            }
        }
    }
}
54
t1ser

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()
            }

        }
    }

}
28
R Thomas

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

  1. iPhone X: 18,7 s/6,3 s/1,8 s/1,8 s/1,8 s
  2. iPhone 7: 4,6 s/3,1 s/3,0 s/2,8 s/2,6 s
  3. iPhone 5s: 7,3s/6,1s/4,0s/4,0s/3,8s

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.

9
Cosmin

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*/
 }
6
Asfand Shabbir
 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

3
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
}
2
Hitesh Chauhan
   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.

2
gosborne3

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                                  

}
2
Amul4608
 let newQueue = DispatchQueue(label: "newname")
 newQueue.sync { 

 // your code

 }
1
Deep

Für Swift 3

   DispatchQueue.main.async {
        // Write your code here
    }
0

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.

0
Mithra Singam