0

定期的にサーバーにポーリングするアプリがあります。ポーリングはタイマータスクを使用して実行されます。タイマーは1つの画面でのみ使用する必要があるため、他の画面に移動するとタイマーが無効になります。

タイマーが無効になることもあれば、無効になることもあります。また、無効にされていない場合、複数のインスタンスが作成され続けます。

私は次のようにタイマーを初期化しました:

 timer = [NSTimer scheduledTimerWithTimeInterval: 2
                                         target: self
                                       selector: @selector(timerTask:)
                                       userInfo: nil
                                        repeats: YES];

そして、次のように無効にされます:

if(timer){

    [timer invalidate];
    timer = nil;


}

この場合に何をする必要があるか、助けてください。

前もって感謝します。

4

4 に答える 4

1

複数のタイマーを作成していますか? 上記のコードで、実行時にタイマーが既に定義されている場合:

 timer = [NSTimer scheduledTimerWithTimeInterval: 2
                                     target: self
                                   selector: @selector(timerTask:)
                                   userInfo: nil
                                    repeats: YES];

timer をさらに参照すると、作成された最新のもののみが得られます。元の参照を取得する唯一の方法は、セレクターの引数をチェックし、定義したタイマー インスタンス変数と異なるかどうかを確認することです。

于 2012-06-07T05:20:41.653 に答える
1

次のように、おそらくタイマーstartingと2 つの異なるメソッドを作成する必要があります。stopping

-(void)startTimer {

     if([timer isValid]) {
         [timer invalidate];
         timer = nil;
      }

     timer = [NSTimer scheduledTimerWithTimeInterval: 2
                                 target: self
                               selector: @selector(timerTask:)
                               userInfo: nil
                                repeats: YES];
}

-(void)stopTimer {

    if([timer isValid]) {
       [timer invalidate];
       timer = nil;
     }
  }

これによりstart、タイマーが可能になり、インスタンスがすでに有効な場合は無効になり、新しいインスタンスが開始されます。停止すると無効になり、次の呼び出しtimerで初期化する準備が整います。startTimer

お役に立てれば !

于 2012-06-07T09:04:20.927 に答える
0

NSTimer を「再開」する方法はありません。タイマーが作成され、画面 2 が呼び出された日付 (時刻を含む) を追跡するために、いくつかのプロパティを作成できます。画面 2 に移動したら、タイマーを無効にし、画面 1 に戻ったら、2 つの日付オブジェクト間の時間差を取得し、ポーリング間の必要な時間からそれを減算し、その時間間隔で新しいタイマーを作成します。これは、ユーザーにはタイマーの「再開」のように見えます。

于 2012-06-07T06:34:05.523 に答える
0

retainオブジェクトにする必要があると思いますNSTimer

timer = [[NSTimer scheduledTimerWithTimeInterval: 2
                                          target: self
                                        selector: @selector(timerTask:)
                                        userInfo: nil
                                         repeats: YES] retain];

そして無効にする

if(timer){

    [timer invalidate];
    [timer release];
    timer = nil;
}
于 2012-06-07T06:46:39.350 に答える