iOS如何在分钟,每分钟调用一个方法

时间:2014-03-07 07:00:53

标签: ios ios7 nsdate nstimer nstimeinterval

我的意思是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];

现在,它正在运作!

2 个答案:

答案 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];

});