我的意思是12:01:00,12:02:00 ......
在iOS7中,我想在一小段时间改变时调用方法。换句话说,如果现在是01:55:47,那么我想在01:56:00调用一个方法 - > 01:57:00 - > 01:58:00 ......
我发现调用方法只是关于TimeInterval,但不是我想要的。
我试过这段代码:
NSTimeInterval roundedInterval = round([[NSDate date] timeIntervalSinceReferenceDate] / 60.0) * 60.0;
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:roundedInterval];
NSTimer *timer = [[NSTimer alloc] initWithFireDate:date
interval:60.0
target:self
selector:@selector(handleEveryMinutes:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
- (void)handleEveryMinutes:(NSTimer *)timer {
NSLog(@"one minute!");
}
但是这个方法不会在第二个0调用。
希望很酷的人可以帮助我!-----我的回答-------
我也弄清楚为什么我的代码无法正常工作,我需要在roundInterval中添加额外的60秒,这是下一分钟的确切时间。如果不添加60秒,则会传递fireDate,因此当我运行我的应用程序时,它必须立即触发。
NSTimeInterval roundedInterval = round([[NSDate date] timeIntervalSinceReferenceDate] / 60.0) * 60.0 + 60; // the extra 60 is used to set the correct time Interval between next minute and referenced date.
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:roundedInterval];
现在,它正在运作!
答案 0 :(得分:5)
关键是在合适的时间启动定期计时器。获取当前时间并找出我们当前分钟的秒数......
NSDateComponents *components = [[NSCalendar currentCalendar] components: NSSecondCalendarUnit fromDate:[NSDate date]];
NSInteger second = [components second];
从这里我们可以获得到下一分钟的秒数......
NSInteger tillNextMinute = (60 - second) % 60;
我没有测试过,但是mod 60的想法是处理第二个为零时的情况。现在我们差不多完成了......
[self performSelector:@selector(startTimer) withObject:nil afterDelay:tillNextMinute];
然后你开始的代码...
- (void)startTimer {
// contains the code you posted to start the timer
}
答案 1 :(得分:2)
目前接受的答案最多不会错误1秒。
以下是如何尽可能精确地获得下一分钟:
// set clock to current date
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSSecondCalendarUnit fromDate:date];
NSTimeInterval timeSinceLastSecond = date.timeIntervalSince1970 - floor(date.timeIntervalSince1970);
NSTimeInterval timeToNextMinute = (60 - dateComponents.second) - timeSinceLastSecond;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeToNextMinute * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self handleEveryMinutes:nil];
});