0

私の中にはいくつかのレシピがありますCoreData。すべてのレシピには属性prepHourprepMinがあります。Start Timerボタンをタップすることで、カウントダウンタイマーを開始します。ただし、同時に動作する必要がある複数のタイマー (たとえば、各レシピ) が存在する場合があります。

私はこの方法を選択しました(間違っているかもしれません):

  1. タイマーには、シングルトンTimersを使用しました。
  2. 開始タイマーをタップして、パラメーター (name、prepHour、prepMin) を指定してメソッドを呼び出します
  3. 私のstartTimerメソッドはタイマーを作成し、それをNSMutableDictionary

呼び出し方法:

[[Timers sharedTimers] startTimer:self.recipe.name startTimer:self.recipe.prepHour startTimer:self.recipe.prepMin];

タイマー シングルトンの場合:

- (void)startTimer:(NSString *)timerName  startTimer:(NSNumber *)hVal startTimer:(NSNumber *)mVal
{
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60.0f target:self selector:@selector(tick:) userInfo:nil repeats:YES];
    if ([timer isValid]) {
        NSArray *array = [NSArray arrayWithObjects: timer, hVal, mVal, nil];
        if (_timerDict == NULL) {
            _timerDict = [[NSMutableDictionary alloc] init];
        }
        [_timerDict setObject:array forKey:timerName];
        NSLog(@"%@", _timerDict);
    }
}

- (void)stopTimer:(NSString *)timerName
{
    NSArray *array = [_timerDict objectForKey:timerName];
    NSTimer *timer = [array objectAtIndex:0];
    if ([timer isValid]) {
        [timer invalidate];
        [_timerDict removeObjectForKey:timerName];
    }
}

- (void)tick:(NSString *)timerName
{
    NSArray *array = [_timerDict objectForKey:timerName];
    //NSTimer *timer = [array objectAtIndex:0];
    NSInteger hVal = [[array objectAtIndex:1] integerValue];
    NSInteger mVal = [[array objectAtIndex:2] integerValue];
    NSInteger sVal = 0;

各タイマーにtickメソッドを使用するにはどうすればよいですか? 各タイマーがこのメソッドを独自のパラメーター (timer、prepHour、prepMin) で呼び出すようにします

4

2 に答える 2

2

これは好みの問題かもしれませんが、タイマーを使用して有効期限を記憶するのではなく、一定の周波数でパルスするために使用します。あなたのアプリでは、1 秒など、最も低い公分母周波数で 1 つのタイマーを使用します。シングルトンの代わりに、アプリのデリゲートが無効にして再起動できる単一のタイマーがあります。

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(tick:) userInfo:nil repeats:YES];

次に、各有効期限を各レシピの 1 つのプロパティとして保持します。例えば:

- (IBAction)pressedStartButtonForRecipeA:(id)sender {

    // this is a NSDate * property
    self.recipeADone = [NSDate dateWithTimeIntervalSinceNow:90*60];  // ninety minutes
}

- (void)tick:(NSTimer *)timer {

    NSDate *now = [NSDate date];
    NSTimeInterval secondsUntilAIsDone = [self.recipeADone timeIntervalSinceDate:now];

    if (secondsUntilAIsDone <= 0.0) {
        // update UI to say that A is done
    } else {
        // update UI to reduce countdown
    }

    // and so on for all recipes
}
于 2013-03-26T05:53:57.647 に答える
1

これは、シングルトンの不適切な使用のように思えます。このデザインを使いたい場合は、タイマーごとに 1 つのタイマーが必要です。または、1 つのタイマーを使用して、各タイマーの開始時からのオフセットを計算することもできます。(どのアプローチが理にかなっているかは、特定のアプリによって異なります。通常は 2 番目の方法を使用しますが、YMMV を使用します。)

また、タイマーは NSString をコールバックに渡しません。彼らは自分自身を渡します。コールバックがタイマーから情報を取得できるようにするには、その情報をタイマーのuserInfo辞書に設定します。

于 2013-03-26T05:39:08.517 に答える