【问题标题】:Strange Behaviour of NSTimerNSTimer 的奇怪行为
【发布时间】:2015-05-10 15:04:30
【问题描述】:

首先,这是我不想达到的目标:

我想从Current date and Time 运行timeruser Selected Date and Time

我做了什么:

  • 来自DatePickerIBOutlet
  • 做了一个UIButton

我尝试过的:

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

   }

我遇到的问题:

  • 每次我选择一个时间,即使比当前时间晚一分钟,计时器也会随机增加一些额外的秒数。我想不通。

Example

** 延迟必须是 1m04Sec,但它显示的是 1m55Sec**

【问题讨论】:

  • @Zaph 看到我用 LINK 更新了我的问题
  • NSLog 在获得结束日期后立即记录startingDateendingDate。手动计算差异。另请注意,时间间隔以秒为单位,而不是毫秒。

标签: ios xcode6 nsdate nstimer uidatepicker


【解决方案1】:

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

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

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

文档添加方法调用,参数无所谓,点击initWithFireDate阅读“快速帮助检查器”中的文档

【讨论】:

  • thnx 寻求帮助...您能否通过示例告诉我,因为我很困惑要传递哪些参数
  • 为什么要在代码中添加一些额外的秒数。他们有什么方法可以解决这个问题
  • 在使用您的代码时,我仍然有一些额外的时间
  • 在代码中加入一些 NSLog 语句,应该可以指出错误。
【解决方案2】:

请注意,模 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 的位置,或者通过交换您分配给它们的值来扭转这种情况。我认为这会让您获得更直观的结果。

【讨论】:

  • 它有效...我怎么能忘记这个...但现在我面临一个奇怪的问题...我的计时器有时有时不运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多