我已经在按钮操作中编写了完成处理程序,就像下面的代码一样。
func backgroundTask(arg: Bool, completion: (Bool) -> ()) {
completion(arg)
}
在“我的按钮”中单击
backgroundTask(arg: true, completion: { (success) -> Void in
if success {
print("true")
} else {
print("false")
}
})
当用户多次按下按钮时,完成处理程序将返回大量时间。
需要多次返回完成处理程序。
我需要放置一个时间戳,之后完成处理程序不需要返回。
最佳答案
你不能简单地取消关闭。相反,您可以创建一个包含函数调用的DispatchWorkItem
,然后您可以取消工作项。不要简单地调用backgroundTask
,而是应该在用户每次按下按钮时创建DispatchWorkItem
,对项目调用perform
,如果截止日期已过,则调用cancel。
独立操场示例:
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
func backgroundTask(arg: Bool, completion: (Bool) -> ()) {
completion(arg)
}
backgroundTask(arg: true, completion: { (success) -> Void in
if success {
print("true")
} else {
print("false")
}
})
let workItem = DispatchWorkItem(block: { backgroundTask(arg: true, completion: {
(success) -> Void in
if success {
print("true")
DispatchQueue.main.asyncAfter(deadline: .now()+2, execute: {
print("Delayed success") //As long as the deadline is smaller than the deadline of `workItem.cancel()`, this will be printed
})
} else {
print("false")
}
})})
workItem.perform()
DispatchQueue.main.asyncAfter(deadline: .now()+3, execute: {
workItem.cancel()
PlaygroundPage.current.finishExecution()
})