0

我的食谱里有好几个CoreData。每个配方都有属性prepHourprepMin。我想通过点击按钮Start Timer开始倒计时。但是可以有几个必须同时工作的计时器(例如每个配方)

我选择了这种方式(可能是错误的):

  1. 对于计时器,我使用了单例Timers
  2. 通过点击我的开始计时器,我调用带有参数的方法(名称、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;

我应该如何为每个计时器使用刻度方法?我希望每个计时器都使用自己的参数(计时器、prepHour、prepMin)调用此方法

4

2 回答 2

2

这可能是一个口味问题,但我不使用计时器来记住到期时间,我使用它们以一定频率脉动。对于您的应用程序,我会以最低公分母频率使用一个计时器,例如一秒。我有一个计时器,而不是单例,应用程序委托可以使应用程序无效并重新启动。

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

然后将每个到期时间保留为每个配方的一个属性。例如:

- (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

这听起来像是对单例的不良使用。如果你想采用这种设计,我会……嗯,每个定时器一个定时器。或者,您可以有一个计时器,并且只计算每个计时器开始时的偏移量。(哪种方法有意义取决于您的特定应用程序。我通常会选择第二种,但 YMMV。)

此外,计时器不会将 NSString 传递给它们的回调;他们通过自己。要允许回调从计时器获取一些信息,您可以将信息设置为计时器的userInfo字典。

于 2013-03-26T05:39:08.517 回答