我已经在按钮操作中编写了完成处理程序,就像下面的代码一样。

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()
})

07-24 09:51