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

时间:2016-10-17 08:21:39

标签: 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
}

4 个答案:

答案 0 :(得分:59)

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

首先,您必须更改声明timerTest

的方式
var timerTest : Timer?

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

func startTimer () {

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

最后在你的stopTimerTest中,如果它不是<{1}},则会使timerTest无效

func stopTimerTest() {
 if timerTest != nil {
    timerTest!.invalidate()
    timerTest = nil
 }
}

答案 1 :(得分:27)

您很可能在没有致电void Connect() { [m_Delegate NSConnect]; //This gives me a error that is unrecognized selector sent to instance } 的情况下两次致电startTimer。如果你这样做,你将失去指向原始计时器的指针,永远无法使它失效。

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

stopTimerTest

然后停止只是设置为nil:

var timerTest : Timer? = nil {
    willSet {
        timerTest?.invalidate()
    }
}

答案 2 :(得分:3)

请确保在致电StartTimer时是nil,并且两次致电StartTimer而不致电StopTimer。您将丢失原始指针,并且无法停止。

 var timer : Timer? = nil {
        willSet {
            timer?.invalidate()
        }
    }

像...一样的启动和停止计时器

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
}

答案 3 :(得分:1)

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

func stopTimerTest() {
    print("stopTimer")
    timerTest.invalidate()
}