2011-11-12 57 views
3

我有一個複雜的問題來形容,所以我保存它,只是總結我即將做的事情。我希望在狀態欄上的時間發生變化時能夠「得到通知」,以便我可以重新計算時間。我目前正在計算時間,直到罰款,但有1分鐘的窗口,我的計算和時間戳不匹配......這一切都取決於他們何時打開應用程序,相比之下,iPhone的「秒」時鐘是什麼時候他們打開它。是否有可能檢測到狀態欄時鐘上的「分鐘」更改?

總之,我們可以檢測狀態欄上的微小變化嗎?如果是這樣,怎麼樣?

謝謝!

回答

2

這是我會怎麼做:

當應用程序啓動時,我會啓動一個定時器,將每秒更新一次檢查時間的變化時。

我第一次發現時間變化時,我會使該計時器無效並啓動一個每分鐘都會啓動的計時器。

這個分鐘計時器將與狀態欄上的時鐘不超過一秒的延遲同步。

+0

良好想着這就是我要做的。謝謝 – Louie

0

有沒有這樣的通知,所以我想你需要寫一些代碼,經常輪詢時間。我會爲此創建一個運行循環源,並將其添加到常用模式,並讓它檢查當前NSTimerInterval因爲您最喜歡的參考日期大於或等於某個包含下一整分鐘時間間隔的預先計算的NSTimeInterval

8

甚至比埃米利奧的回答簡單 - 當你的看法負載(或當你想觸發事件)只是檢查當前日期(例如用NSCalendar)的秒部分,安排一個計時器,將在60 currentSeconds火(這將是下一分鐘,零秒),最後,計劃每60秒觸發一次的新計時器。

+0

這是最聰明的答案。 –

+0

這工作對我來說,但我不得不做61-currentSeconds – thedeveloper3124

6

基於@ MJA的建議:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [calendar components:NSSecondCalendarUnit fromDate:[NSDate date]]; 
NSInteger currentSecond = [components second]; 

//+1 to ensure we fire right after the minute change 
NSDate *fireDate = [[NSDate date] dateByAddingTimeInterval:60 - currentSecond + 1]; 
NSTimer *timer = [[NSTimer alloc] initWithFireDate:fireDate 
              interval:60 
              target:self 
              selector:@selector(YOURSELECTORHERE) 
              userInfo:nil 
              repeats:YES]; 

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

我使用它,它的偉大工程。如果你需要刪除定時器,你必須更加小心。

1

基於@ SG1代碼示例,但斯威夫特:

 //calculate fireDate on every minute's first second 
     let now: Date = Date() 
     let calendar: Calendar = Calendar.current 
     let currentSeconds: Int = calendar.component(.second, from: now) 
     //init timer 
     self.timer = Timer(
      fire: now.addingTimeInterval(Double(60 - currentSeconds + 1)), 
      interval: 60 /*seconds*/, 
      repeats: true, 
      block: { (t: Timer) in 
       self.sendNotification() 
     }) 
     //start timer 
     RunLoop.main.add(self.timer, forMode: RunLoopMode.defaultRunLoopMode) 

     private func sendNotification(){ 
     ... 
     }