簡體   English   中英

objc中的時間更改通知(小時和分鍾)

[英]Time change notification (hours and minutes) in objc

時間變化時,是否有最佳方法來獲取通知?

我正在使用NSTimer ,它每隔0,002秒檢查一次是否更改了時間(小時和分鍾,而不是秒和毫秒),以使應用程序中的標簽與電話時鍾保持每分鍾同步。

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

謝謝

如果您只想在分鍾更改時進行更新,則可以做到這一點:

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

設置從下一分鍾開始的循環計時器:

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的重大意外更改,即“更改為新的一天(午夜),運營商時間更新以及夏令時前后的更改”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM