我们调用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
}
答案 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()
}