Vergleich zwischen verschiedenen Ansätzen in Swift 3.0
1. Sleep
Diese Methode hat keinen Rückruf. Setzen Sie den Code direkt nach dieser Zeile ein, um ihn nach 4 Sekunden auszuführen. Es wird den Benutzer daran hindern, mit UI-Elementen wie dem Testbutton zu interagieren, bis die Zeit abgelaufen ist. Obwohl der Button irgendwie "einfriert", wenn der Sleep einsetzt, drehen sich andere Elemente wie der Aktivitätsindikator weiter, ohne einzufrieren. Sie können diese Aktion während des Sleeps nicht erneut auslösen.
sleep(4)
print("fertig") // Hier die Aktionen ausführen
2. Dispatch, Perform und Timer
Diese drei Methoden funktionieren ähnlich, sie werden alle im Hintergrundthread mit Rückrufen ausgeführt, nur mit unterschiedlicher Syntax und leicht unterschiedlichen Funktionen.
Dispatch wird häufig verwendet, um etwas im Hintergrundthread auszuführen. Der Rückruf ist ein Teil des Funktionsaufrufs.
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
print("fertig")
})
Perform ist tatsächlich ein vereinfachter Timer. Er richtet einen Timer mit der Verzögerung ein und löst dann die Funktion durch den Selektor aus.
perform(#selector(callback), with: nil, afterDelay: 4.0)
func callback() {
print("fertig")
}}
Und schließlich bietet Timer auch die Möglichkeit, den Rückruf zu wiederholen, was in diesem Fall nicht nützlich ist.
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(callback), userInfo: nil, repeats: false)
func callback() {
print("fertig")
}}
Bei all diesen drei Methoden friert die UI nicht ein, wenn Sie auf den Button klicken, und Sie können erneut darauf klicken. Wenn Sie erneut auf den Button klicken, wird ein weiterer Timer eingerichtet und der Rückruf wird zweimal ausgelöst.
Zusammenfassend
Keine der vier Methoden funktioniert alleine gut genug. sleep
wird die Benutzerinteraktion deaktivieren, sodass der Bildschirm einfriert (nicht wirklich) und ein schlechtes Benutzererlebnis liefert. Die anderen drei Methoden frieren den Bildschirm nicht ein, aber Sie können sie mehrmals auslösen, und die meiste Zeit möchten Sie warten, bis Sie den Rückruf erhalten, bevor Sie dem Benutzer erneut erlauben, den Anruf zu tätigen.
Ein besserer Ansatz wäre die Verwendung einer der drei asynchronen Methoden mit Bildschirmblockierung. Wenn der Benutzer auf den Button klickt, bedecken Sie den gesamten Bildschirm mit einem halbtransparenten View, auf dem ein sich drehender Aktivitätsindikator angezeigt wird, um dem Benutzer mitzuteilen, dass der Buttonklick bearbeitet wird. Entfernen Sie dann das View und den Indikator in der Rückruffunktion, um dem Benutzer mitzuteilen, dass die Aktion ordnungsgemäß behandelt wurde usw.