使用Swift 3停止scheduledTimer,即使timer为零,Timer也会继续触发

Hop*_*ope 28 timer swift3

我们调用startTimer函数来启动计时器.当我们想要停止它时,我们调用stopTimerTest函数,但在我们调用stopTimer函数后,timerTestAction继续触发.要检查计时器条件,我们在timerActionTest中使用print和print返回nil.

var timerTest: Timer? = nil

func startTimer () {
    timerTest =  Timer.scheduledTimer(
        timeInterval: TimeInterval(0.3),
        target      : self,
        selector    : #selector(ViewController.timerActionTest),
        userInfo    : nil,
        repeats     : true)
}

func timerActionTest() {
    print(" timer condition \(timerTest)")
}

func stopTimerTest() {
    timerTest.invalidate()
    timerTest = nil
}
Run Code Online (Sandbox Code Playgroud)

mat*_*mat 76

尝试对代码进行以下更改:

首先,您必须更改声明的方式 timerTest

var timerTest : Timer?
Run Code Online (Sandbox Code Playgroud)

然后在startTimer实例化之前检查是否timerTest为零

func startTimer () {
  guard timerTest == nil else { return }

  timerTest =  Timer.scheduledTimer(
      timeInterval: TimeInterval(0.3),
      target      : self,
      selector    : #selector(ViewController.timerActionTest),
      userInfo    : nil,
      repeats     : true)
}
Run Code Online (Sandbox Code Playgroud)

最后,如果它不是零,你stopTimerTest就会失效timerTest

func stopTimerTest() {
  timerTest?.invalidate()
  timerTest = nil
}
Run Code Online (Sandbox Code Playgroud)

  • 那很好笑.我不知道有人开始"宣传"自己的答案!;) (5认同)
  • 记得null safe timerTest?.invalidate(),一行 (3认同)
  • `guard timeTest == nil else { return }` 很重要 (2认同)

Rob*_*ier 33

很可能你没有打电话startTimer就打了两次电话stopTimerTest.如果你这样做,你将失去指向原始计时器的指针,永远无法使它失效.

典型的方法是将失效作为设置的一部分进行管理:

var timerTest : Timer? = nil {
    willSet {
        timerTest?.invalidate()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后停止只是设置为零:

func stopTimerTest() {
    timerTest = nil
}
Run Code Online (Sandbox Code Playgroud)


Igo*_*gor 5

检查,你真的打电话了stopTimerTest(),因为timerTest.invalidate()停止计时器是正确的。

func stopTimerTest() {
    print("stopTimer")
    timerTest.invalidate()
}
Run Code Online (Sandbox Code Playgroud)


San*_*rya 5

确保您何时调用StartTimer它,nil以及是否在StartTimer未调用的情况下调用了两次StopTimer。您将丢失原始指针并且无法阻止它。

 var timer : Timer? = nil {
        willSet {
            timer?.invalidate()
        }
    }
Run Code Online (Sandbox Code Playgroud)

启动和停止计时器,如...

func startTimer() {
    stopTimer()
    guard self.timer == nil else { return }
    self.timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.fetchData), userInfo: nil, repeats: true)
}

func stopTimer() {
    guard timer != nil else { return }
    timer?.invalidate()
    timer = nil
}
Run Code Online (Sandbox Code Playgroud)