2016-05-13 49 views
2

我知道,當你背景的應用程序,計時器停止運行。但是,當你從背景中回來時,這是什麼行爲?計時器是否保持原來的fireDate應用程序背景時,NSTimer的行爲是什麼?

我遇到了一個問題,當NSTimer設置爲在十分鐘內啓動後,有時候我會立即讓定時器在applicationWillEnterForeground:被調用之前觸發。當它沒有觸發,並且調用了applicationWillEnterForeground:時,我有一些邏輯來通過比較計時器的fireDate到當前日期來檢查10分鐘是否已經過去,但是,即使10分鐘過去了,它似乎總是給我一個從當前日期起將來約525秒。

我的理論是這樣的:

  • NSTimer將在未來從後臺背火的計時器,只要你有沒有錯過了比原計劃更多的預定時間。 (在這種情況下,我們計劃10分鐘的定時器,只要您在後臺進行10-20分鐘,它將在重新進入應用程序時觸發。)

  • 如果超過了通過時,它不會觸發,而是在您返回時在未來的同一時間段內安排另一個計時器。 (也就是說如果你用10分鐘的計時器在背景中持續20分鐘以上,當你回來時,它會在你回到應用程序後的將來安排10分鐘的計時器。)

有沒有人有關於此行爲的任何文檔?我的理論純粹是基於觀察,關於背景缺失或者我無法找到背景的文檔。

回答

4

您正確觀察了NSTimer的行爲。

如果您現在創建一個應該每十分鐘觸發一次的計時器,它會嘗試從現在開始十分鐘,20分鐘,30分鐘等等。如果應用程序在一分鐘後進入休眠狀態並在12分鐘後喚醒,則計時器將立即啓動,然後在20分鐘後啓動(不是在計時器啓動後10分鐘,而是在原始時間後20分鐘)。

但是,如果計時器完全錯過了一個事件,然後又遲到了下一個計時器事件,比如說如果你在29分鐘後醒來,那麼10分鐘的事件將被丟棄,20分鐘的事件會立刻被觸發可能的(29分鐘後),30分鐘後30分鐘的事件發射。

+0

這反映在[NSTimer文檔](https://developer.apple。 com/documentation/foundation/timer#1667611):「如果一個計時器被安排在特定的時間以及之後每隔5秒觸發一次,那麼計劃的開火時間將總是落在原始的5秒時間間隔上,即使實際如果開火時間延遲至其通過一個或多個預定的開火時間,則在該時間段內定時器僅被開火一次;然後在開火後重新安排定時器以用於下一個預定開火在未來的時間。「 – joakim

0

你不能使用計時器來解決這個問題。以下是我在調查類似問題後發現的:

  • 應用程序在後臺運行約30秒後,計時器停止。
  • 當您從後臺重新輸入時,計時器會再次啓動。

你可以做些什麼來克服這個問題,並正確地添加這個功能,你將不得不在你的後端服務器上實現定時器。當計時器啓動時點擊服務,當應用程序處於前景時啓動計時器。計時器將自行處理,但當應用程序被終止或在後臺時,服務器將進入遊戲。點擊一項服務即可獲取已過的時間,或者在10分鐘過後發送推送通知。

+0

所以我認爲你正在描述一個稍有不同的問題。計時器似乎繼續受到監控,然後在您返回時被觸發,但是,如果您等待足夠長時間,似乎在您返回而不是開始計時時重新計劃計時器。 –

+0

嗯,我認爲它的工作方式是大約30-90秒後停止定時器,並且如果特定時間已經過去了,它會殺死定時器 –

相關問題