2015-05-26 30 views
0

當時間變化時是否有獲得通知的最佳做法?objc中的時間更改通知(小時和分鐘)

我使用的是NSTimer,如果時間更改(小時和分鐘,而不是秒和毫秒),則每隔0.002秒檢查一次,以保持每分鐘同步電話時鐘的應用程序中的標籤。

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

謝謝

+1

NSTimer是您的任務很好的解決方案,您還可以收聽UIApplicationSignificantTimeChangeNotification(當用戶在設置中設置時間時發送)。但是如果你的計時器的間隔太小,你不需要通知觀察 –

回答

4

如果你只是想更新時,微小的變化,這應該做的伎倆:

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

修改你的解決方案從日期中提取秒組件,也不起作用。我已經採用了NSTimer的解決方案,但並沒有像我期望的那樣立即更新標籤。 –

+1

嘗試通過調用[self performSelectoronMainThread:@selector(updateLabel)withObject:nil]更新主線程上的標籤; –

+0

應更新主線程上的標籤。它會工作。 –

1

設置重複計時器開始下一個整分鐘:

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,即「更改爲新的一天(午夜),載波時間更新和更改或從夏令時」。