Imaginez un écran S. Les utilisateurs arrivent à S, regardent des choses. Il y a un bouton B ...
| |
| B|
| |
| |
Lorsque vous appuyez sur B .
func clickedB() {
blockingSpinner = true
longCalculation()
blockingSpinner = false
showResult()
}
func longCalculation() {
// a few seconds
}
(Nous voulons que l'utilisateur attende simplement, en voyant un spinner modal, si/pendant que le calcul est en cours).
Généralement, lorsqu'un utilisateur arrive sur l'écran S, il regarde autre chose pendant quelques secondes avant de toucher B.
Alors...
var waitor = DispatchSemaphore(value: 0) // or ???
func viewDidLoad() {
DispatchQueue.global(qos: .background).async { longCalculation() }
}
func longCalculation() {
something waitor
do the calculation
something waitor
DispatchQueue.main.async {
something waitor
}
}
func clickedB() {
// (note that ... calculation may have finished ages ago
// or we may be in the middle of it, it has a second or so remaining
// or perhaps even this is the second+ time the user has clicked B)
something waitor
if/while longCalculation is still running,
blockingSpinner = true
blockingSpinner = false
showResult()
}
J'ai peur de n'avoir aucune idée de comment utiliser DispatchSemaphore
dans ce scénario.
La façon particulière dont ils ont fait wait()
y signal()
le travail ne semble pas s'additionner ici.
Mode d'emploi DispatchSemaphore
dans ce scénario ?