[英]Swift - Timer doesn't stop
我有以下代码:
class firstVC: UIViewController {
var timer : Timer?
func scheduledTimerWithTimeInterval(){
timer = Timer.scheduledTimer(timeInterval: 60, target: self,
selector: #selector(self.anotherFunc), userInfo: nil, repeats:
true)
}
override func viewDidAppear(_ animated: Bool) {
scheduledTimerWithTimeInterval()
}
}
我试图阻止计时器但没有成功:
func stopTimer() {
if timer != nil {
timer?.invalidate()
timer = nil
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
stopTimer()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
stopTimer()
}
我甚至尝试将stop函数放在applicationWillResignActive
和applicationDidEnterBackground
但它没有停止:
firstVC().stopTimer()
感谢您的帮助,谢谢。
正如其他人所说的那样,在开始新的计时器之前,你创建了多个计时器而没有杀死旧计时器。 您需要确保在开始新计时器之前停止任何当前计时器。
我所做的是让我的计时器变弱。 然后在尝试创建新计时器之前使用代码`myTimer?.invalidate():
class firstVC: UIViewController {
weak var timer : Timer?
func scheduledTimerWithTimeInterval(){
timer?.invalidate()
timer = Timer.scheduledTimer(timeInterval: 60, target: self,
selector: #selector(self.anotherFunc), userInfo: nil, repeats:
true)
}
}
通过使你的计时器变弱,唯一保持对计时器的强引用的是运行循环。 然后,当它使它失效时,它会立即释放并设置为nil。 通过使用可选的链接调用无效的方法,如果它已经为零,并停止,并导致它,如果它正在运行去无它没有做任何事情。
请注意,只有使用其中一个scheduledTimer()
工厂方法一次性创建计时器时,此方法才有效。 如果您首先尝试创建计时器然后将其添加到运行循环中,则必须使用强大的局部变量来创建它,或者在创建它时立即释放它。
问题是你的计时器被多次实例化,所以原来的计时器失去了它的引用。 添加变量didStartTimer = false。 然后在viewDidAppear中进行验证,然后调用timer func。 应该这样做。
像这样:
class firstVC: UIViewController {
var timer : Timer?
var didStartTimer = false
func scheduledTimerWithTimeInterval(){
timer = Timer.scheduledTimer(timeInterval: 60, target: self,
selector: #selector(self.anotherFunc), userInfo: nil, repeats:
true)
}
override func viewDidAppear(_ animated: Bool) {
if !didStartTimer {
scheduledTimerWithTimeInterval()
didStartTime = true
}
}
作为调试步骤,尝试将var timer = Timer()
放在全局空间中(例如,在import
语句下面的文件顶部),以确保只创建和引用一个Timer对象。 如果你在一个函数中有Timer
声明,你每次调用该函数时都会创建一个新的计时器,这会导致你丢失对旧函数的引用,并最终不会停止它。
没有什么对我有用,最后使用自己做了伎俩!
self.atimer!.invalidate()
self.atimer = Timer()
经过研究,我找到了解决方案,
唯一对我有用的是在AppDelegate文件中创建函数并在需要时调用它们,
这是代码,timerSwitch函数:
func timerSwitch()
{
if (timerStatus) {
checkStateTimer = Timer.scheduledTimer(
timeInterval: 60,
target:self,
selector: #selector(self.yourFunction),
userInfo: nil, repeats: true)
} else {
checkStateTimer?.invalidate()
}
}
func stopTimer()
{
timerStatus = false
timerSwitch()
}
func startTimer()
{
timerStatus = true
timerSwitch()
}
虽然'yourFunction'是你想要在计时器启动时执行的,
在我的情况下发送心跳。
然后我调用了timerSwitch是AppDelegate中的以下函数:
func applicationWillResignActive(_ application: UIApplication) {
stopTimer()
}
func applicationDidEnterBackground(_ application: UIApplication) {
stopTimer()
}
func applicationDidBecomeActive(_ application: UIApplication) {
startTimer()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.