2016-08-08 14 views
2

私のアプリには、のオブジェクトがあり、数秒ごとに残りのURLにリクエストが送信されます。NSTimerを無効にする

特定のボタンをクリックすると、ポーリングを停止し、別のボタンをクリックするようにタイマーを停止します。buttonポーリングを再開します。

すべてのタイマーでinvalidateを試しましたが、動作しません。

注:すべてのタイマーが異なるクラスにあり、私は別のクラスのタイマーを無効にしようとしています 助けていただきありがとうございます、ありがとうございます。別のクラスにおいて

class NotificationViewController:UIViewController { 
    var timer:NSTimer? 
    getEvents(){ 
    if((timer == nil)) { 
     timer = NSTimer.scheduledTimerWithTimeInterval(20.0, target: self, selector: Selector("getEvents"), userInfo: nil, repeats: true) 
    } 
    } 
} 

私は、ボタンのクリック時に

class Menu:UIViewController { 

    @IBAction func buttonTapped(sender: UIButton) { 
     self.notify.timer?.invalidate() 
     self.notify.timer = nil 
    } 
} 
+1

この方法のようにそのメソッドを呼び出します。 –

+0

質問を編集しました –

+0

'self.notify'オブジェクトは、あなたが' NSTimer'を初期化するのに使ったのと同じものですか? –

答えて

1

別のNotificationTimerクラスを作成して、このようにプロジェクト全体で共有オブジェクトを使用してください。

class NotificationTimer: NSObject { 

    var timer1: NSTimer? 
    var timer2: NSTimer? 
    var timer3: NSTimer? 
    var timer4: NSTimer? 

    static let sharedManager = NotificationTimer() 

    func getEvents(){ 
     print("Fired") 
     if (timer1 == nil){ 
      timer1 = NSTimer.scheduledTimerWithTimeInterval(20.0, target: self, selector: Selector("methodYouWantToCall"), userInfo: nil, repeats: true) 
     } 
    }  
} 

は今、この方法のように任意のViewController内でこのtimer1オブジェクトを呼び出します。

let notificationTimer = NotificationTimer.sharedManager 
notificationTimer.timer1?.invalidate() 

それとも、試してみるのコードを入れて

NotificationTimer.sharedManager().getEvents() 
+0

タイマーは一度しか起動しません。 20秒後に繰り返しません –

+0

セレクタを変更しましたか? getEventsはタイマーを初期化するのと同じものです。 –

+0

いいえ、私はセレクタを変更していません、それは同じです。このメソッドは1回だけ呼び出され、20秒後には再実行されません。 –

3

これをやっているあなたがタイマーを元の参照を失っているようです。 可能なevilの解決策は、アプリ全体で参照を保持することです。

struct Timers { 
    static var firstTimer = NSTimer() 
    static var secondTimer = NSTimer() 
    static var thirdTimer = NSTimer() 
    static var fourthTimer = NSTimer() 
} 

あなたがプログラムのどこからでもタイマーにアクセスすることができ、この方法は:

タイマーをキャンセル
Timers.firstTimer.invalidate() 
+0

タイマーはまだ動作していません –

+0

なぜ静的が必要ですか???あなたはなぜプログラムのどこからでもタイマーにアクセスする必要がありますか?それはタイマーのリリースにどのように関連していますか?それは解決策ではありません!さらに、ほとんどの場合反パターンです – Nikita

+0

別のViewControllerクラスからタイマーを停止したいので、そのViewControllerでそのタイマーにアクセスする必要があります –

0
  1. を(タイマー場合は、struct を使用していることを行うことができます。 isValid()){ timer.invalidate() }

    timer = nil;

  2. アプリをデバッグして、タイマーを解除しない場所を確認してください。

  3. タイマーはターゲットを保持しているので、ターゲットを解放する必要がある場合は、タイマーも解放する必要があります。また、ターゲットを週参照して独自のタイマーを作成することもできます。

関連する問題