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.

25voto

Cyril Punkte 2686

Sie können dies auch mit Swift 3 tun.

Führen Sie die Funktion so nach einer Verzögerung aus.

override func viewDidLoad() {
    super.viewDidLoad()

    self.perform(#selector(ClassName.performAction), with: nil, afterDelay: 2.0)
}

     @objc func performAction() {
//Diese Funktion wird nach 2 Sekunden ausgeführt
            print("Verzögert")
        }

22voto

Suragch Punkte 420096

NSTimer

Der Antwort von @nneonneo zufolge wird die Verwendung von NSTimer vorgeschlagen, aber es wurde nicht gezeigt, wie es gemacht wird. Hier ist die grundlegende Syntax:

let delay = 0.5 // Zeit in Sekunden
NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(myFunctionName), userInfo: nil, repeats: false)

Hier ist ein sehr einfaches Projekt, das zeigt, wie es verwendet werden könnte. Wenn eine Schaltfläche gedrückt wird, startet sie einen Timer, der nach einer Verzögerung von einer halben Sekunde eine Funktion aufruft.

import UIKit
class ViewController: UIViewController {

    var timer = NSTimer()
    let delay = 0.5

    // Timer starten, wenn die Schaltfläche gedrückt wird
    @IBAction func startTimerButtonTapped(sender: UIButton) {

        // Timer abbrechen, falls die Schaltfläche mehrmals gedrückt wird
        timer.invalidate()

        // Timer starten
        timer = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)
    }

    // Funktion, die nach der Verzögerung aufgerufen werden soll
    func delayedAction() {
        print("Aktion wurde gestartet")
    }
}

Die Verwendung von dispatch_time (wie in der Antwort von Palle) ist eine weitere gültige Option. Allerdings ist es schwer abzubrechen. Mit NSTimer reicht es aus, um ein verzögertes Ereignis vor seinem Eintreten abzubrechen, einfach

timer.invalidate()

Die Verwendung von sleep wird nicht empfohlen, insbesondere nicht auf dem Hauptthread, da es die gesamte Arbeit auf dem Thread stoppt.

Siehe hier für meine ausführlichere Antwort.

18voto

Legolas Wang Punkte 1220

Ich glaube, der einfachste und neueste Weg, um einen 4-Sekunden-Timer zu erstellen, ist:

Task { 
    // Mach etwas

    // Warte 4 Sekunden
    try await Task.sleep(nanoseconds: 4_000_000_000) 

}

Es verwendet Swift 5.5's neue Nebenläufigkeit.

Apple's Concurren

11voto

Vakas Punkte 5840

Versuchen Sie die folgende Implementierung in Swift 3.0

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

Verwendung

delayWithSeconds(1) {
   //Machen Sie etwas
}

11voto

Booharin Punkte 735

Wenn Sie eine Verzögerung von weniger als einer Sekunde einstellen müssen, ist es nicht notwendig, den .seconds-Parameter festzulegen. Ich hoffe, dies ist für jemanden nützlich.

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
        // dein 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