NSTimer 的奇怪行为

Strange Behaviour of NSTimer

Firstly, this is what I wan't to achieve:

我想 运行 timerCurrent date and Timeuser Selected Date and Time

What I have done:

What I have tried:

- (IBAction)schedulePostTapped:(id)sender
{

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateCountdown:) userInfo:nil repeats:YES];
}

- (void)updateCountdown:(NSTimer *)timer
{
NSDate *startingDate = [chooseDate date];


NSDate *endingDate = [NSDate date];

double secondsTime = [endingDate timeIntervalSinceDate:startingDate];


NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit;
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:startingDate toDate:endingDate options:0];

NSInteger hours    = [dateComponents hour];
NSInteger minutes  = [dateComponents minute];
NSInteger seconds  = [dateComponents second];
NSString *countdownText = [NSString stringWithFormat:@"%ld Hours %ld Minutes %ld Seconds",(long)hours, (long)minutes, (long)seconds];
self.statusLabel.text = countdownText;

NSLog(@"%@",[NSString stringWithFormat:@"%f",secondsTime]);

    if (secondsTime==0) {
        [timer invalidate];
        timer = nil;
    }

   }

The issue I'm having:

Example

** 延迟必须为 1 分 04 秒,但显示为 1 分 55 秒**

不要每秒都有定时器文件,启动定时器后不要询问结束时间

请务必从用户处获取结束时间,然后使用 initWithFireDate: 使用未来日期启动计时器。您必须使用 addTimer:forMode: 将新计时器添加到 运行 循环中。触发后,计时器将消息 aSelector 发送到目标。

节省他们触摸按钮的时间。通过将所选持续时间与保存的时间相加来计算点火时间。

对于文档添加方法调用,参数无关紧要,单击 initWithFireDate 并阅读 "Quick Help Inspector"

中的文档

请注意,模 60,-55 与 5 全等。您向后计算的事实似乎会使事情变得混乱。看看这个:

NSDate *startingDate = [chooseDate date];
NSDate *endingDate = [NSDate date];

所以endingDate是第二行执行的当前时间,startingDate是选择器中选择的时间(在你的例子中是将来)。当您根据日历计算差异时...

NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:startingDate toDate:endingDate options:0];

您似乎得到 -1 分钟和 -55 秒。尝试通过在上面的方法调用中切换 startingDateendingDate 的位置,或者通过交换您分配给它们的值来扭转局面。我认为这会让您获得更直观的结果。