【发布时间】:2016-04-03 03:29:43
【问题描述】:
我有这个问题好几天了,我不明白我做错了什么。
我的应用程序基本上只是创建了一些计时器。我需要阻止它们并创建新的。但目前阻止它们不起作用。
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
【问题讨论】:
-
您确定计时器不会停止吗?会不会是您正在创建多个计时器?
-
确保从主线程调用
stopAlarm()。 -
@MariusFanu 我肯定会从主线程调用 stopAlarm。我打印了线程以确保它是同一个。
-
@Cristik 如果执行 timerDidEnd 我打印出一行,所以我知道它确实结束了。如果我在同一线程上使用 stopAlarm() 之后,无论如何都会打印出该行。所以我认为计时器不会停止。我也不认为在这种情况下可以创建多个计时器,因为我总是使用相同的变量,所以它会被覆盖,对吧? :D
-
没有错,但没有意义。如果计时器没有运行,它应该是
nil。通用实例NSTimer()不是nil但实际上什么都不做。