如何使用计时器停止 long-运行 函数? Swift 4
How to use a timer to stop a long-running function? Swift 4
我有一个功能 运行s 很长一段时间,如果可能的话,我想给它一个 10 秒的上限。我还想实现一个 Cancel
按钮供用户按下。
我尝试在计算时简单地检查 var abort
的状态,但它只是继续工作。我对 Grand Central Dispatch
和 timers
不是很熟练,不知道从这里到哪里去。
...
var abort = false
@objc func abortCalculations() {
abort = true
}
func calculate() {
abort = false
let _ = Timer(timeInterval: 10, target: self, selector: #selector(abortCalculations), userInfo: nil, repeats: false)
dispatchGroup.enter()
DispatchQueue.global(qos: .userInteractive).async {
while !abort {
x += 1 // for example, just something that repeats
// when this actually finishes, it leaves the dispatch group
}
}
}
...
我希望函数 calculate()
在计时器停止时(或者在将来用户按下按钮时)完成。相反,它继续 运行 并且永远不会调用函数 abortCalculations()
。
您可以使用类似的 DispatchQueue
来设置中止标志,而不是使用 Timer
。
var abortFlagItem = DispatchWorkItem(block: {
self.abort = true
})
DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: abortFlagItem)
如果您想取消,可以随时致电abortFlagItem.cancel()
我有一个功能 运行s 很长一段时间,如果可能的话,我想给它一个 10 秒的上限。我还想实现一个 Cancel
按钮供用户按下。
我尝试在计算时简单地检查 var abort
的状态,但它只是继续工作。我对 Grand Central Dispatch
和 timers
不是很熟练,不知道从这里到哪里去。
...
var abort = false
@objc func abortCalculations() {
abort = true
}
func calculate() {
abort = false
let _ = Timer(timeInterval: 10, target: self, selector: #selector(abortCalculations), userInfo: nil, repeats: false)
dispatchGroup.enter()
DispatchQueue.global(qos: .userInteractive).async {
while !abort {
x += 1 // for example, just something that repeats
// when this actually finishes, it leaves the dispatch group
}
}
}
...
我希望函数 calculate()
在计时器停止时(或者在将来用户按下按钮时)完成。相反,它继续 运行 并且永远不会调用函数 abortCalculations()
。
您可以使用类似的 DispatchQueue
来设置中止标志,而不是使用 Timer
。
var abortFlagItem = DispatchWorkItem(block: {
self.abort = true
})
DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: abortFlagItem)
如果您想取消,可以随时致电abortFlagItem.cancel()