當時間變化時是否有獲得通知的最佳做法?objc中的時間更改通知(小時和分鐘)
我使用的是NSTimer
,如果時間更改(小時和分鐘,而不是秒和毫秒),則每隔0.002秒檢查一次,以保持每分鐘同步電話時鐘的應用程序中的標籤。
我希望有一個更好的解決方案。
謝謝
當時間變化時是否有獲得通知的最佳做法?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)];
}
修改你的解決方案從日期中提取秒組件,也不起作用。我已經採用了NSTimer的解決方案,但並沒有像我期望的那樣立即更新標籤。 –
嘗試通過調用[self performSelectoronMainThread:@selector(updateLabel)withObject:nil]更新主線程上的標籤; –
應更新主線程上的標籤。它會工作。 –
設置重複計時器開始下一個整分鐘:
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
:
}
您可能還需要響應UIApplicationSignificantTimeChangeNotification
重大,意想不到的變化來更新你的UI,即「更改爲新的一天(午夜),載波時間更新和更改或從夏令時」。
NSTimer是您的任務很好的解決方案,您還可以收聽UIApplicationSignificantTimeChangeNotification(當用戶在設置中設置時間時發送)。但是如果你的計時器的間隔太小,你不需要通知觀察 –