2014-03-07 80 views
1

我的意思是12:01:00,12:02:00 ...iOS如何在分钟,每分钟拨打一个方法

在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秒

希望冷静的人能帮帮我!

-----我的回答-------

我也明白,为什么我的代码无法正常工作,我需要额外60秒添加到roundedInterval,这是确切的时间下一分钟。如果不添加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

您的计时器设置为一秒的间隔。现在,如果秒数为00,则可以在委托函数内部检查。如果是这样,请调用您的函数。或在正确的时间打电话给你的delgate。我的意思是你必须打电话给你的delgate在00. –

回答

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 
} 
+0

很酷,你给我另一种方法来解决这种情况。我还想知道为什么我的代码无法正常工作,我需要在roundInterval中添加额外的60秒,这是下一分钟的确切时间。如果不添加60秒,fireDate就会被传递,所以当我运行我的应用程序时,它必须立即启动。 –

+0

我应该已经更清楚了,你可以删除那个roundedInterval代码。我的建议是四舍五入。只需要安排计时器。 – danh

+0

谢谢!你帮了我很多! –

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

});