我现在有这个问题几天了,我不知道我做错了什么.
我的应用程序基本上只是创建一些计时器.我需要阻止他们并创造新的.但目前阻止他们是行不通的.
self.timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target:self, selector: "timerDidEnd:", userInfo: "Notification fired", repeats: false)
那是我的计时器
func timerDidEnd(timer:NSTimer){ createUnrepeatedAlarmWithUpdateInterval() }
因为我的计时器不想停止我正在使用未重复的计时器并在它停止后自己启动它.
func stopAlarm() { if self.timer != nil { self.timer!.invalidate() } self.timer = nil self.timer = NSTimer() }
这就是我停止计时器的方式.
alarmManager.stopAlarm() alarmManager.createUnrepeatedAlarmWithUpdateInterval()
我stopAlarm()
在创建新计时器之前调用该函数.
我真的不知道我做错了什么,所以我很感激每一个答案:)
class AlarmManager: ViewController{ private var timer : NSTimer? private var unrepeatedTimer : NSTimer? private let notificationManager = NotificationManager() private var current = NSThread() private let settingsViewController = SettingsViewController() func createRepeatedAlarmWithUpdateInterval(){ var timeInterval:NSTimeInterval = settingsViewController.getUpdateIntervalSettings() if timer == nil{ timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: "repeatedTimerDidEnd:", userInfo: "Notification fired", repeats: true) } } func repeatedTimerDidEnd(repeatedTimer:NSTimer){ ConnectionManager.sharedInstance.loadTrainings(settingsViewController.getServerSettings()) createUnrepeatedAlarm(10) } func createUnrepeatedAlarm(timeInterval:Double){ unrepeatedTimer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: "unrepeatedTimerDidEnd:", userInfo: "Notification fired", repeats: false) } func unrepeatedTimerDidEnd(unrepeatedTimer:NSTimer){ notificationManager.createNotification(self, reminderType: NotificationManager.ITEMRATINGREMINDER) notificationManager.createNotification(self, reminderType: NotificationManager.ITEMREMINDER) print("UnrepeatedAlarm ended") } func stopAlarm(){ print("StopAlarm triggered") if (timer != nil) { print("stoptimer executed") timer!.invalidate() timer = nil } if (unrepeatedTimer != nil) { unrepeatedTimer!.invalidate() unrepeatedTimer = nil } } }
这是这个类的整个代码.也许这会有所帮助:D
安全启动和停止计时器的常用方法是
var timer : NSTimer? func startTimer() { if timer == nil { timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: "timerFired", userInfo: nil, repeats: true) } } func stopTimer() { if timer != nil { timer!.invalidate() timer = nil } }
startTimer()
开始只有当它的定时器nil
和stopTimer()
停止它,只有当它不是nil
.
您只需要在创建/启动新计时器之前停止计时器.
在Swift 3中更换
NSTimer
用Timer
,
NSTimer.scheduledTimerWithTimeInterval(
同 Timer.scheduledTimer(timeInterval:
selector: "timerFired"
与selector: #selector(timerFired)
.
确保在与计时器相同的线程上调用invalidate.
从文档:
特殊注意事项您必须从安装了计时器的线程发送此消息.如果从另一个线程发送此消息,则可能无法从其运行循环中删除与计时器关联的输入源,这可能会阻止线程正常退出.
https://developer.apple.com/documentation/foundation/nstimer/1415405-invalidate?language=objc