我想有效地实现这种行为:
(用户)要求运行一个功能。知道计时器也会自动重复调用此功能,因此我想确保该功能在运行时就返回。
使用伪代码:
var isRunning = false
func process() {
guard isRunning == false else { return }
isRunning = true
defer {
isRunning = false
}
// doing the job
}
我知道信号量的概念:
let isRunning = DispatchSemaphore(value: 1)
func process() {
// *but this blocks and then passthru rather than returning immediately if the semaphore count is not zero.
isRunning.wait()
defer {
isRunning.signal()
}
// doing the job
}
您将如何使用信号量与信号量或任何其他解决方案来实现此行为?
答案 0 :(得分:2)
您可以使用wait(timeout:)
和now()
的超时值来测试
信号。如果信号量计数为零,则返回.timedOut
,
否则返回.success
(并减少信号量计数)。
let isRunning = DispatchSemaphore(value: 1)
func process() {
guard isRunning.wait(timeout: .now()) == .success else {
return // Still processing
}
defer {
isRunning.signal()
}
// doing the job
}