0

この NSTimer を 45 分後に停止したいのですが、停止しません。私は何を間違っていますか?

TIMER_COUNT = 45

HOURS_IN_HOURS = 60

HOURS_IN_DAY = 24

- (void)start
{
    self.timerCountdown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES];
}

- (void)stop
{
    [self.timerCountdown invalidate];
    self.timerCountdown = nil;
}

- (void)updateCountdown
{
    NSDate *currentDate = [NSDate date];
    NSDate *finalTime = [currentDate dateByAddingTimeInterval:(TIMER_COUNT * HOURS_IN_HOUR)];

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *componentsHours   = [calendar components:NSHourCalendarUnit fromDate:currentDate];
    NSDateComponents *componentMinuts   = [calendar components:NSMinuteCalendarUnit fromDate:currentDate];
    NSDateComponents *componentSeconds  = [calendar components:NSSecondCalendarUnit fromDate:currentDate];

    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *componentsDaysDiff = [gregorianCalendar components:NSDayCalendarUnit
                                                                fromDate:currentDate
                                                                  toDate:finalTime
                                                                 options:0];

    NSLog(@"%20d Days, %02d Hours, %02d Minutes, %02d Seconds.", componentsDaysDiff.day, HOURS_IN_DAY - componentsHours.hour, HOURS_IN_HOUR - componentMinuts.minute, HOURS_IN_HOUR - componentSeconds.second);

    if ([currentDate compare:finalTime] == NSOrderedSame)
    {
        NSLog(@"Done.");
        [self stop];
    }
}

前もって感謝します。

4

3 に答える 3

1

currentDateタイマーが作動するたびに、あなたの意志が設定され続けるからです。メソッドが実行されるたびに現在の時刻に[NSDate date]設定されます。したがって、 は常に より 45 分早くなります。代わりに、プロパティを作成してメソッドに設定する必要があります。currentDateupdateCountdownfinalTimecurrentDatestartDatestart

- (void)start
{
    self.timerCountdown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES];
    self.startDate = [NSDate date];
}

次に、updateCountdownメソッドのプロパティを確認します。

if ([self.startDate compare:finalTime] == NSOrderedSame)
{
    NSLog(@"Done.");
    [self stop];
}

または、予想されるティック数で整数を使用し、タイマーがティックするたびに整数から 1 を減算することもできます。このようなもの:

- (void)start
{
    self.timerCountdown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats:YES];
    self.countdown = TIMER_COUNT * HOURS_IN_HOUR;
}

- (void)updateCountdown
{
    self.countdown--;

    //your code

    if (self.countdown == 0)
    {
         NSLog(@"Done.");
         [self stop];
    }
}
于 2013-10-22T06:34:14.737 に答える