私は今数日間この問題を抱えており、私が間違っていることを理解していません。
私のアプリケーションは基本的にいくつかのタイマーを作成しています。それらを停止して新しいものを作成する必要があります。しかし、現時点ではそれらを停止しても機能しません。
_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置換
NSTimer
with Timer
、NSTimer.scheduledTimerWithTimeInterval(
_と_Timer.scheduledTimer(timeInterval:
_selector: "timerFired"
_とselector: #selector(timerFired)
。タイマーと同じスレッドで無効化を呼び出していることを確認してください。
ドキュメントから:
特別な考慮事項タイマーがインストールされているスレッドからこのメッセージを送信する必要があります。このメッセージを別のスレッドから送信した場合、タイマーに関連付けられている入力ソースが実行ループから削除されない可能性があり、スレッドが適切に終了しない可能性があります。
https://developer.Apple.com/documentation/foundation/nstimer/1415405-invalidate?language=objc