2012-01-19 11 views
1

私は繰り返し実行する必要があるNSTimerオブジェクトを持っています。それが呼び出すコードは、最終的に私のアプリケーションの設定を4つの状態に切り替えるものです。状態が変わるたびに、自分のタイマーでインターバルを変更したい。このループは、アプリケーションの存続期間を通して継続する必要があります。ベストプラクティス:セレクタメソッドを呼び出すたびに繰り返しNSTimer間隔を更新する方法

私が知る限り、NSTimerintervalプロパティは更新できません。これは、タイマーコード内で自分の状態を切り替えるたびに、新しいNSTimerオブジェクトを作成するコードを追加する必要があると考えています。

//Consider that in my containing class, there is an NSTimer property, named myTimer. 

//My selector method, used by myTimer 
-(void) updateState:(NSTimer *) timer 
{ 
    switch (AppState) 
    { 
    case state_1: 
     //Update current state to state_2 
     [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:30.0 
                  target:self 
                 selector:@selector(updateState:) 
              userInfo:nil repeats:NO]; 
     break; 
    case state_2: 
     //Update current state to state_3 
     [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:5.0 
                  target:self 
                 selector:@selector(updateState:) 
              userInfo:nil repeats:NO]; 
     break; 
    case state_3: 
     //Update current state to state_4 
     [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:30.0 
                  target:self 
                 selector:@selector(updateState:) 
              userInfo:nil repeats:NO]; 
     break; 
    case state_4: 
     //Update current state back to state_1 
     [self setMyTimer:[NSTimer scheduledTimerWithTimeInterval:5.0 
                  target:self 
                 selector:@selector(updateState:) 
              userInfo:nil repeats:NO]; 
     break; 
    } 
} 

はこれが最適なソリューションですか、それは継続的に実行されるように、すべてのこれらのタイマーの作成は、私のアプリケーションのための任意の形式のトラブルを引き起こす可能性があります:次の実装では、私が考えている何ですか?

また、私のプロジェクトではARCカットがあります。この場合、以前のNSTimerオブジェクトを破壊する必要がありますか?

+3

これらがタイミング間隔であれば、繰り返し5秒タイマーを使用し、カウンタを使用して状態3と1でより長い間隔を達成してください。 –

+1

@TriPhoenix回答。 – justin

答えて

2

これらのタイマーをすべて作成すると、アプリケーションが継続的に実行されるため、フォームの問題が発生する可能性がありますか?

メモリを正しく管理している限りではありません。合成されたセッターを使用することでこれが処理されます。

この場合、以前のNSTimerオブジェクトを破壊する必要がありますか?

明示されていません。反復しないタイマーが起動すると、自身を無効にし、実行ループはreleaseを送信します(保持していたため)。クレームがある場合は、それをリリースする必要があります。これはセッターを使用して行います。

これらのタイマーのいずれも繰り返しされていないので、あなたはIVARを削除し、代わりにperformSelector:withObject:afterDelay:

- (void)updateState { 

    NSTimeInterval delay = 30; 
    switch(AppState) 
    { 
     case 1: { break; } 
     case 2: { delay = 5.0; 
        break; } 
     case 3: { break; } 
     case 4: { delay = 5.0; 
        break; } 
    } 

    [self performSelector:@selector(updateState) 
       withObject:nil 
       afterDelay:delay]; 

} 

を使用することができます(ちなみに、私はあなたの実際のコードにbreak秒を持っていると仮定します。あなたは間違いなく場合はすべきあなたはそうではありません。)

+0

私はこの回答を他の人に好むと思います。また、私は実際のコードで休憩しています。私の上記のコードは完全な例として書かれています。私はこの日を1日開いたままにしておき、それ以外の実行可能な回答があるかどうかを確認するだけです。 – RLH

+0

完全に合理的です。あなたの処置に間違いがないので、私の答えはちょうど提案にすぎません。 –