Vergleich zwischen verschiedenen Ansätzen in Swift 3.0
1. Schlaf
Diese Methode hat keinen Rückruf. Setzen Sie Codes direkt hinter diese Zeile, um sie in 4 Sekunden auszuführen. Es verhindert, dass Benutzer mit UI-Elementen wie der Testschaltfläche iterieren, bis die Zeit abgelaufen ist. Obwohl die Taste beim Einsetzen des Schlafes eingefroren ist, drehen sich andere Elemente wie die Aktivitätsanzeige immer noch, ohne einzufrieren. Sie können diese Aktion im Ruhezustand nicht erneut auslösen.
sleep(4)
print("done")//Do stuff here
2. Dispatch, Perform und Timer
Diese drei Methoden funktionieren ähnlich. Sie werden alle im Hintergrund-Thread mit Rückrufen ausgeführt, nur mit unterschiedlicher Syntax und leicht unterschiedlichen Funktionen.
Der Versand wird häufig verwendet, um etwas im Hintergrund-Thread auszuführen. Es hat den Rückruf als Teil des Funktionsaufrufs
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
print("done")
})
Perform ist eigentlich ein vereinfachter Timer. Es stellt einen Timer mit der Verzögerung ein und löst dann die Funktion per Selektor aus.
perform(#selector(callback), with: nil, afterDelay: 4.0)
func callback() {
print("done")
}}
Und schließlich bietet der Timer auch die Möglichkeit, den Rückruf zu wiederholen, was in diesem Fall nicht sinnvoll ist
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(callback), userInfo: nil, repeats: false)
func callback() {
print("done")
}}
Wenn Sie bei all diesen drei Methoden auf die Schaltfläche klicken, um sie auszulösen, friert die Benutzeroberfläche nicht ein und Sie können erneut darauf klicken. Wenn Sie erneut auf die Schaltfläche klicken, wird ein anderer Timer eingerichtet und der Rückruf wird zweimal ausgelöst.
Abschließend
Keine der vier Methoden funktioniert allein gut genug. sleep
Deaktiviert die Benutzerinteraktion, sodass der Bildschirm (nicht wirklich) " einfriert " und zu einer schlechten Benutzererfahrung führt. Die anderen drei Methoden frieren den Bildschirm nicht ein, aber Sie können sie mehrmals auslösen. In den meisten Fällen möchten Sie warten, bis Sie den Anruf zurückerhalten, bevor Sie dem Benutzer erlauben, den Anruf erneut zu tätigen.
Ein besseres Design wird also eine der drei asynchronen Methoden mit Bildschirmblockierung verwenden. Wenn der Benutzer auf die Schaltfläche klickt, decken Sie den gesamten Bildschirm mit einer durchscheinenden Ansicht ab, auf der sich eine rotierende Aktivitätsanzeige befindet, die dem Benutzer mitteilt, dass das Klicken auf die Schaltfläche ausgeführt wird. Entfernen Sie dann die Ansicht und die Anzeige in der Rückruffunktion, um dem Benutzer mitzuteilen, dass die Aktion ordnungsgemäß ausgeführt wurde usw.