585 Stimmen

Dispatch_after - GCD in Swift? dispatch_after - GCD in Swift?

Ich habe das iBook von Apple durchgesehen und konnte keine Definition davon finden:

Kann jemand die Struktur von dispatch_after erklären?

dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)

24voto

Senseful Punkte 79049

Apple hat ein dispatch_after snippet für Objective-C:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    <#code to be executed after a specified delay#>
});

Hier ist das gleiche snippet für Swift 3:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + <#delayInSeconds#>) {
  <#code to be executed after a specified delay#>
}

15voto

garafajon Punkte 1099

Ein anderer Weg ist es, Double auf diese Weise zu erweitern:

extension Double {
   var dispatchTime: dispatch_time_t {
       get {
           return dispatch_time(DISPATCH_TIME_NOW,Int64(self * Double(NSEC_PER_SEC)))
       }
   }
}

Dann können Sie es so verwenden:

dispatch_after(Double(2.0).dispatchTime, dispatch_get_main_queue(), { () -> Void in
            self.dismissViewControllerAnimated(true, completion: nil)
    })

Ich mag Matts Verzögerungsfunktion, aber nur aus Präferenz würde ich lieber das Herumgeben von Closures begrenzen.

9voto

In Swift 3.0

Dispatch-Warteschlangen

  DispatchQueue(label: "test").async {
        //Lang laufende Hintergrundaufgabe
        for obj in 0...1000 {
            print("asynchron \(obj)")
        }

        // UI-Aktualisierung in Hauptwarteschlange
        DispatchQueue.main.async(execute: { 
            print("UI-Aktualisierung in Hauptwarteschlange")
        })

    }

    DispatchQueue(label: "m").sync {
        //Lang laufende Hintergrundaufgabe
        for obj in 0...1000 {
            print("synchron \(obj)")
        }

        // UI-Aktualisierung in Hauptwarteschlange
        DispatchQueue.main.sync(execute: {
            print("UI-Aktualisierung in Hauptwarteschlange")
        })
    }

Nach 5 Sekunden verschieben

    DispatchQueue.main.after(when: DispatchTime.now() + 5) {
        print("Verschiebung nach 5 Sekunden")
    }

5voto

Himanshu Mahajan Punkte 4603

Swift 3.0-Version

Nachfolgende Closure-Funktion führt einige Aufgaben nach einer Verzögerung im Hauptthread aus.

func performAfterDelay(delay: Double, onCompletion: @escaping() -> Void){

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay, execute: {
       onCompletion()
    })
}

Rufen Sie diese Funktion wie folgt auf:

performAfterDelay(delay: 4.0) {
  print("test")
}

5voto

Alvin George Punkte 13610

1) Fügen Sie diese Methode als Teil der UIViewController-Erweiterung hinzu.

extension UIViewController{
func runAfterDelay(delay: NSTimeInterval, block: dispatch_block_t) {
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
        dispatch_after(time, dispatch_get_main_queue(), block)
    }
}

Rufen Sie diese Methode auf VC auf:

    self.runAfterDelay(5.0, block: {
     //Fügen Sie hier den Code zu diesem Block hinzu
        print("Erfolg nach Verzögerung ausführen")
    })

2)

performSelector("IhrMethodenname", withObject: nil, afterDelay: 1)

3)

override func viewWillAppear(animated: Bool) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2), dispatch_get_main_queue(), { () -> () in
    //Code Hier
})

//Kompakte Form

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2), dispatch_get_main_queue()) {
    //Code hier
 }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X