如何取消并重新启动Swift中的定时事件?

时间:2017-04-02 21:09:18

标签: ios swift events delay cancellation

我有一个sliderValueChange函数可以更新UILabel的文本。我希望它有一个时间限制,直到它清除标签的文本,但我也希望这个“定时清除”动作被取消&在“定时清除”操作发生之前,只要在时间限制内移动UISlider,就会重新启动或延迟。

到目前为止,这就是我所拥有的:

let task = DispatchWorkItem {
  consoleLabel.text = ""
}
func volumeSliderValueChange(sender: UISlider) {

  task.cancel()

  let senderValue = String(format: "%.2f", sender.value)
  consoleLabel.text = "Volume: \(senderValue)"

  DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: task)  
}

显然,这种方法不起作用,因为cancel()显然无法逆转..(或者至少我不知道如何)。我也不知道如何在此函数结束时启动一个新任务,如果调用该函数将取消该任务。

我是以错误的方式来做这件事的吗?我有什么东西可以忽视这项工作吗?

2 个答案:

答案 0 :(得分:2)

使用计时器:

weak var clearTimer: Timer?

override func viewDidLoad() {
  super.viewDidLoad()
  startClearTimer()
}

func startClearTimer() {
  clearTimer = Timer.scheduledTimer(
    timeInterval: 3.0,
    target: self,
    selector: #selector(clearLabel(_:)),
    userInfo: nil,
    repeats: false)
}   

func clearLabel(_ timer: Timer) {
   label.text = ""
}

func volumeSliderValueChange(sender: UISlider) {
   clearTimer?.invalidate()  //Kill the timer
   //do whatever you need to do with the slider value
   startClearTimer()  //Start a new timer
}

答案 1 :(得分:1)

问题在于你取消了错误的东西。你不想取消任务;你想要取消{em>倒计时,当你说asyncAfter时,你要取消它。

因此使用DispatchTimer或NSTimer(现在称为Swift中的Timer)。这些是可以取消的反击。然后你可以再次开始计算。