wake-up-neo.com

So programmieren Sie eine Verzögerung in Swift 3

In früheren Versionen von Swift konnte eine Verzögerung mit dem folgenden Code erstellt werden:

let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
    //put your code which should be executed with a delay here
}

Aber jetzt, in Swift 3, ändert Xcode automatisch 6 verschiedene Dinge, aber dann erscheint der folgende Fehler: "Kann DispatchTime.now nicht in den erwarteten Wert dispatch_time_t aka UInt64 konvertieren."

Wie kann eine Verzögerung erzeugt werden, bevor eine Codesequenz in Swift 3 ausgeführt wird?

283
owlswipe

Nach viel Recherche habe ich es endlich herausgefunden.

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Change `2.0` to the desired number of seconds.
   // Code you want to be delayed
}

Dies erzeugt den gewünschten "Warte" -Effekt in Swift 3 und Swift 4.

Inspiriert von einem Teil von diese Antwort .

846
owlswipe

Ich mag die einzeilige Notation für GCD, sie ist eleganter:

    DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) {
        // do stuff 42 seconds later
    }

In iOS 10 gibt es auch neue Timer-Methoden, z. Blockinitialisierer:

(daher kann die verspätete Aktion abgebrochen werden)

    let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
        // do stuff 42 seconds later
    }

Übrigens: Standardmäßig wird der Timer zum Standard-Run-Loop-Modus hinzugefügt. Dies bedeutet, dass der Timer möglicherweise eingefroren wird, wenn dieser Loop-Modus angehalten wird (z. B. beim Scrollen einer UIScrollView). Sie können dieses Problem beheben, indem Sie den Timer dem spezifischen Run-Loop-Modus hinzufügen:

RunLoop.current.add(timer, forMode: .commonModes)

In diesem Blog-Beitrag finden Sie weitere Details.

130
Victor Do

Probieren Sie die folgende Funktion aus, die in Swift 3.0 und höher implementiert ist

func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { 
        completion()
    }
}

Verwendungszweck

delayWithSeconds(1) {
   //Do something
}
51
Vakas

Versuchen Sie den folgenden Code für die Verzögerung

//MARK: First Way

func delayForWork() {
    delay(3.0) {
        print("delay for 3.0 second")
    }
}

delayForWork()

// MARK: Second Way

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    // your code here delayed by 0.5 seconds
}
28
Anand Verma

Eine Möglichkeit ist, DispatchQueue.main.asyncAfter zu verwenden, da viele Leute geantwortet haben.

Eine andere Möglichkeit ist die Verwendung von perform(_:with:afterDelay:). Mehr Details hier

perform(#selector(delayedFunc), with: nil, afterDelay: 3)

@IBAction func delayedFunc() {
    // implement code
}
1
Zohaib Brohi

// Führt die Funktion nach x Sekunden aus

public static func runThisAfterDelay(seconds: Double, after: @escaping () -> Void) {
    runThisAfterDelay(seconds: seconds, queue: DispatchQueue.main, after: after)
}

public static func runThisAfterDelay(seconds: Double, queue: DispatchQueue, after: @escaping () -> Void) {
    let time = DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
    queue.asyncAfter(deadline: time, execute: after)
}

//Verwenden:-

runThisAfterDelay(seconds: x){
  //write your code here
}
1
Pratyush Pratik