web-dev-qa-db-ja.com

swift無効化タイマーが機能しない

私は今数日間この問題を抱えており、私が間違っていることを理解していません。

私のアプリケーションは基本的にいくつかのタイマーを作成しています。それらを停止して新しいものを作成する必要があります。しかし、現時点ではそれらを停止しても機能しません。

_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

18
Banelu

タイマーを安全に開始および停止する通常の方法は

_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)
33
vadian

タイマーと同じスレッドで無効化を呼び出していることを確認してください。

ドキュメントから:

特別な考慮事項タイマーがインストールされているスレッドからこのメッセージを送信する必要があります。このメッセージを別のスレッドから送信した場合、タイマーに関連付けられている入力ソースが実行ループから削除されない可能性があり、スレッドが適切に終了しない可能性があります。

https://developer.Apple.com/documentation/foundation/nstimer/1415405-invalidate?language=objc

7
Kevin Kruusi