スクリーンSを想像してください。ユーザーはSに着いて、物を見てください。あなたはBを押すとボタンBがDispatchSemaphoreをこの「開始ビジー」投機処理シナリオで使用してください
| |
| B|
| |
| |
が
func clickedB() {
blockingSpinner = true
longCalculation()
blockingSpinner = false
showResult()
}
func longCalculation() {
// a few seconds
}
が... ...あります(私たちは、ユーザーがちょうど/場合の計算問題が発生している間、モーダルスピナーを見て、待ちたいです。)ユーザーがスクリーンSに到着したときに
は一般的に、彼らはB.
に触れる前に、数秒間何か他のものを見てそう...
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()
}
このシナリオではDispatchSemaphore
の使用方法がわかりません。
彼らが作った特定のやり方は、ここで合算していないようです。wait()
とsignal()
DispatchSemaphore
このシナリオではどのように使用しますか?
ジョシュの下の答えは、SOネット全体の単一の最良の回答の1つでなければならないでしょうork。 – Fattie