0

是否有最佳实践在时间更改时获取通知?

如果时间更改(小时和分钟,而不是秒和毫秒),我正在使用NSTimer每 0,002 秒检查一次,以使我的应用程序中的标签每分钟与电话时钟保持同步。

我希望有更好的解决方案。

谢谢

4

2 回答 2

5

如果您只想在分钟更改时更新,这应该可以解决问题:

NSDate *date = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:NSHourCalendarUnit fromDate:date];
[self performSelector:@selector(minuteHasChanged) withObject:nil afterDelay:(60 - dateComponents.minute)];

而且,如果您可以确定只调用此方法一次,那么您可以执行以下操作:

- (void)minuteHasChanged {
    //do stuff

    NSDate *date = [NSDate date];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *dateComponents = [calendar components:NSHourCalendarUnit fromDate:date];
    [self performSelector:@selector(minuteHasChanged) withObject:nil afterDelay:(60 - dateComponents.minute)];
}
于 2015-05-26T18:24:10.370 回答
2

设置从下一整分钟开始的循环计时器:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)        

    let nextMinuteDate =  NSCalendar.currentCalendar().nextDateAfterDate(NSDate(), matchingUnit: .Second, value: 0, options: [.MatchNextTime])!
    self.minuteDidChangeTimer = NSTimer(fireDate: nextMinuteDate, interval: 60.0, target: self, selector: "minuteDidChangeTimer:", userInfo: nil, repeats: true)
    NSRunLoop.currentRunLoop().addTimer(self.minuteDidChangeTimer, forMode: NSDefaultRunLoopMode)

    :
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    self.minuteDidChangeTimer.invalidate()
    self.minuteDidChangeTimer = nil

    :
}

您可能还希望更新您的 UI 以响应UIApplicationSignificantTimeChangeNotification重大的意外更改,即“更改为新的一天(午夜)、运营商时间更新以及更改为夏令时或取消夏令时”。

于 2016-02-25T10:39:25.177 回答