404 Stimmen

Wie erstellt man eine Verzögerung in Swift?

Ich möchte meine App an einem bestimmten Punkt pausieren. Mit anderen Worten, meine App soll den Code ausführen, dann an einem bestimmten Punkt 4 Sekunden lang pausieren und dann mit dem Rest des Codes fortsetzen. Wie kann ich das tun?

Ich benutze Swift.

10voto

Hardik Thakkar Punkte 14308

Sie können eine Erweiterung erstellen, um die Verzögerungsfunktion einfach zu verwenden (Syntax: Swift 4.2+)

extension UIViewController {
    func delay(_ delay:Double, closure:@escaping ()->()) {
        DispatchQueue.main.asyncAfter(
            deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
    }
}

Wie man es in UIViewController benutzt

self.delay(0.1, closure: {
   //code ausführen
})

9voto

Robert Dresler Punkte 10534

Bearbeiten:

Ich empfehle dringend, mit Swift Concurrency zu beginnen. Mit Swift Concurrency können Sie einfach die aktuelle Aufgabe mit Task.sleep pausieren.


Mit der Methode .asyncAfter von DispatchQueue können Sie Code nach einer bestimmten Zeit ausführen. Zum Beispiel sieht die Ausführung von ... auf dem Hauptthread nach einer Sekunde wie folgt aus:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) { ... }

Mit meiner praktischen Datentypen-Delay-Struktur können Sie es auf eine ausgefallenere Weise ausführen:

struct Delay {

    @discardableResult
    init(_ timeInterval: TimeInterval, queue: DispatchQueue = .main, executingBlock: @escaping () -> Void) {
        queue.asyncAfter(deadline: .now() + timeInterval, execute: executingBlock)
    }

}

Verwendung:

Delay(0.4) { ... }

9voto

Robin Stewart Punkte 2174

Wenn Ihr Code bereits in einem Hintergrundthread ausgeführt wird, pausieren Sie den Thread mit dieser Methode in Foundation: Thread.sleep(forTimeInterval:)

Zum Beispiel:

DispatchQueue.global(qos: .userInitiated).async {

    // Code wird bereits in einem Hintergrundthread ausgeführt, daher ist es sicher zu schlafen
    Thread.sleep(forTimeInterval: 4.0)
}

(Siehe andere Antworten für Vorschläge, wenn Ihr Code im Hauptthread läuft.)

6voto

Sentry.co Punkte 4730
DispatchQueue.global(qos: .background).async {
    sleep(4)
    print("Aktiv nach 4 Sekunden und blockiert nicht den Hauptthread")
    DispatchQueue.main.async{
        //Hier wird etwas im Hauptthread gemacht
    }
}

6voto

Ethan Wrightson Punkte 129

Um eine einfache Zeitverzögerung zu erstellen, können Sie Darwin importieren und dann sleep(Sekunden) verwenden, um die Verzögerung zu bewirken. Dies nimmt jedoch nur ganze Sekunden, für präzisere Messungen können Sie Darwin importieren und usleep(Millionstel einer Sekunde) für sehr präzise Messungen verwenden. Um dies zu testen, habe ich folgendes geschrieben:

import Darwin
print("Das ist eins.")
sleep(1)
print("Das ist zwei.")
usleep(400000)
print("Das ist drei.")

Das druckt, wartet dann 1 Sekunde und druckt, dann wartet es 0,4 Sekunden und druckt. Alles wie erwartet funktioniert.

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