iOS版,每分钟如何呼吁分钟的方法(iOS how to call a method on the

2019-10-19 12:21发布

我的意思是12:01:00,12点02分00秒...

在iOS7,我要当的时间分改为调用一个方法。 换句话说,如果现在是1点55分47秒,那么我想在1时56分零零秒调用一个方法 - > 1时57分〇〇秒 - > 1时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μL秒,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];

现在,它的工作!

Answer 1:

关键是在合适的时间来启动该定期计时器。 获取当前时间,并找出我们进入当前分钟多少秒?

NSDateComponents *components = [[NSCalendar currentCalendar] components: NSSecondCalendarUnit fromDate:[NSDate date]];
NSInteger second = [components second];

由此我们可以得到的秒数,直到下一分钟...

NSInteger tillNextMinute = (60 - second) % 60;

我没有测试过这一点,但国防部60的想法是当第二个零来处理这种情况。 现在,我们几乎完成了...

[self performSelector:@selector(startTimer) withObject:nil afterDelay:tillNextMinute];

然后你的代码开始...

- (void)startTimer {
    // contains the code you posted to start the timer
}


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

});


文章来源: iOS how to call a method on the minute, every minute