NSTimer 的奇怪行为
Strange Behaviour of NSTimer
Firstly, this is what I wan't to achieve:
我想 运行 timer
从 Current date and Time
到 user Selected Date and Time
。
What I have done:
IBOutlet
个 DatePicker
- 做了一个
UIButton
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:
- 每次我 select 一次,即使在当前时间后一分钟,计时器也会随机添加一些额外的秒数。我想不通。
** 延迟必须为 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
秒。尝试通过在上面的方法调用中切换 startingDate
和 endingDate
的位置,或者通过交换您分配给它们的值来扭转局面。我认为这会让您获得更直观的结果。
Firstly, this is what I wan't to achieve:
我想 运行 timer
从 Current date and Time
到 user Selected Date and Time
。
What I have done:
IBOutlet
个DatePicker
- 做了一个
UIButton
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:
- 每次我 select 一次,即使在当前时间后一分钟,计时器也会随机添加一些额外的秒数。我想不通。
** 延迟必须为 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
秒。尝试通过在上面的方法调用中切换 startingDate
和 endingDate
的位置,或者通过交换您分配给它们的值来扭转局面。我认为这会让您获得更直观的结果。