我们调用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)
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)
检查,你真的打电话了stopTimerTest(),因为timerTest.invalidate()停止计时器是正确的。
func stopTimerTest() {
print("stopTimer")
timerTest.invalidate()
}
Run Code Online (Sandbox Code Playgroud)
确保您何时调用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)