«Warte eine Sekunde»: Warum Verzögerungen in Swift Magie und keine Hacks sind
\n\nStellen Sie sich vor: Sie schreiben eine App zum Bestellen von Pizza. Der Benutzer klickt auf «Bezahlen», und sofort – bumm! – wird das Geld abgebucht. Ohne Animation, ohne Pause, ohne das Gefühl, dass «etwas passiert». Der Benutzer erschrickt, schließt die App, und Sie verlieren einen Kunden. Eine Verzögerung in Swift ist kein Krückstock, sondern ein Werkzeug für UX-Design und eine saubere Architektur.
\n\nDie Frage «How to create a delay in Swift?» auf Stack Overflow hat zehntausende Aufrufe gesammelt. Und das ist kein Wunder: Anfänger versuchen, sleep() zu verwenden (Spoiler: das geht nicht), während Profis nach eleganten Lösungen suchen. Wir werden 5 funktionierende Methoden durchgehen – vom klassischen GCD bis zu modernem async/await. Los geht's!
1. Der Klassiker: DispatchQueue.main.asyncAfter (iOS 4+)
\nDie beliebteste Methode, um eine Verzögerung in Swift zu erstellen, ist DispatchQueue.main.asyncAfter. Sie funktioniert auf jeder iOS-Version und benötigt keine zusätzlichen Imports. Geeignet für die Ausführung von Code auf dem Hauptthread (z. B. UI-Updates).
import UIKit\n\nclass ViewController: UIViewController {\n override func viewDidLoad() {\n super.viewDidLoad()\n \n // Verzögerung von 2 Sekunden\n DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {\n print("2 Sekunden sind vergangen!")\n self.showAlert()\n }\n }\n \n func showAlert() {\n let alert = UIAlertController(title: "Hallo!", message: "Das ist eine Verzögerung", preferredStyle: .alert)\n alert.addAction(UIAlertAction(title: "OK", style: .default))\n present(alert, animated: true)\n }\n}\n\nVor- und Nachteile
\n- \n
- Vorteile: Einfachheit, Abwärtskompatibilität, funktioniert auf dem Hauptthread. \n
- Nachteile: Die Verzögerung kann nicht abgebrochen werden (es sei denn, man speichert das DispatchWorkItem). \n
2. Abbrechbare Verzögerung mit DispatchWorkItem
\nManchmal muss eine Verzögerung abgebrochen werden – zum Beispiel, wenn der Benutzer den Bildschirm verlässt. DispatchWorkItem löst dieses Problem. Wir speichern eine Referenz auf die «Arbeit» und rufen cancel() auf.
class DelayedTask {\n private var workItem: DispatchWorkItem?\n \n func scheduleDelayedAction() {\n // Aufgabe erstellen\n let item = DispatchWorkItem { [weak self] in\n print("Aufgabe nach Verzögerung ausgeführt")\n self?.doSomething()\n }\n \n // Speichern und starten\n workItem = item\n DispatchQueue.main.asyncAfter(deadline: .now() + 3.0, execute: item)\n }\n \n func cancelDelayedAction() {\n workItem?.cancel()\n workItem = nil\n print("Aufgabe abgebrochen")\n }\n \n func doSomething() {\n // Ihr Code\n }\n}\n\n// Verwendung\nlet task = DelayedTask()\ntask.scheduleDelayedAction()\n// Nach 1 Sekunde abbrechen\nDispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {\n task.cancelDelayedAction()\n}\n\nBeachten Sie [weak self] – das ist zwingend erforderlich, um Speicherlecks in Swift zu vermeiden. Eine Verzögerung kann den Controller überleben, wenn die Referenz nicht geschwächt wird.
3. Timer.scheduledTimer: Verzögerung mit Wiederholung
\nSwift-Timer sind nicht nur für sich wiederholende Aufgaben da. Man kann einen einmaligen Timer mit einer Verzögerung erstellen. Vorteil: Der Timer lässt sich leicht abbrechen und anhalten.
\n\nclass TimerExample {\n var timer: Timer?\n \n func startDelayedAction() {\n // Einmaliger Timer nach 1,5 Sekunden\n timer = Timer.scheduledTimer(withTimeInterval: 1.5, repeats: false) { [weak self] _ in\n print("Timer nach 1,5 Sekunden ausgelöst")\n self?.updateUI()\n }\n }\n \n func stopTimer() {\n timer?.invalidate()\n timer = nil\n }\n \n func updateUI() {\n // Interface aktualisieren\n }\n}\n\nWann Timer verwenden
\n- \n
Blogs
Buchempfehlungen
JavaScript (Node.js) für Data Science: Datenanalyse und maschinelles Lernen auf dem Server
Sauberer Code in Kotlin: Verständlich, effizient und fehlerfrei schreiben
Funktionale Programmierung in TypeScript: Von den Grundlagen zu fortgeschrittenen Patterns
GraphQL auf TypeScript: Moderner Ansatz für APIs