2

NSTimerを使い終えるたびに、NSTimerを無効にして新しい間隔を作成したいのですが、古い間隔と​​新しい間隔が保持されます。offButtonをクリックしたら、NSTimesを無効にしたい。タイマーは「Working」の出力を停止しますが、異なる間隔でメソッドを呼び出すと、両方の間隔で「Working」が出力されます。

私のコードは次のようなものです:

-(void) fireTimer{
    NSString *textValue = [sliderLabel text];
    float value = [textValue floatValue];

    [NSTimer scheduledTimerWithTimeInterval:value target:self selector:@selector(vibrate:) userInfo:nil repeats:YES];

}

- (void) vibrate:(NSTimer*)timer {
    if(_offButton.selected){
        [timer invalidate];
        timer=nil;
    }

    NSLog(@"Working");


}
4

2 に答える 2

3
  1. から直接値を取得することで、MVCデザインパターンに従っていませんUITextField。これらの値はモデルオブジェクトに格納する必要があり、MVCパターンを使用して、テキストフィールドからモデルに新しい値を取得します。現在の実装は非常にデリケートで、ほんの少しの風で壊れます。また、このコードがUI要素にアクセスする必要がありますが、これは非常に柔軟性がありません。モデルオブジェクトのみにアクセスできるようにすることをお勧めします。

  2. NSTimer *をインスタンス変数として保存します。ARCを使用している場合はNSTimer ターゲット(!!)を保持するため、このインスタンス変数を作成__weakして保持サイクルを中断します。

  3. タイマーを繰り返したい場合は、タイマーをリセットする必要はありません。これは、ユーザーが時間を変更した場合にのみ実行する必要があります(ポイント1を参照)。

  4. if (button_selected) do_vibrate;コードをtimerfiredメソッドに移動します。

于 2013-02-23T14:16:33.773 に答える
1

自分で使用する無効化コードは正しいです。ただし、タイマーへの参照をivarまたはプロパティとして保持する方が簡単です。

その場合、タイマーの複数のインスタンスを作成することは絶対に避けてください。

于 2013-02-23T14:13:34.047 に答える