2013-01-16 172 views
0

我有一個應用程序可以創建消息,然後發送到主機服務器。iOS每5分鐘檢查一次

該應用程序必須能夠完全脫機工作,因此當消息創建(並存儲到CoreData中)時,它們被設置爲「未發送」。該應用程序然後嘗試立即發送它們。如果有連接並且服務器響應是肯定的,那麼我將消息設置爲「發送」。

當然,這意味着如果手機在創建信息時處於離線狀態,則永遠不會發送。

我的所有消息都是通過管理所有消息發送和排隊的單例對象發送的。

我試圖把NSTimer放入觸發發送每5分鐘(更改爲10秒進行測試)的單例init中。這工作正常,直到我停止應用的時間超過NSTimer的時間。

如果我停止了30秒的應用程序,然後重新啓動它,然後定時器不會觸發。

有沒有更好的方式來做到這一點,使我得到相同的功能?即每隔幾分鐘檢查一次傳出的消息併發送正在等待的任何消息。

編輯

我不是無效定時器或任何東西。只是,如果應用程序在計時器因火災而未激活時似乎不再安排。

的代碼爲我NSTimer是...

[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(sendMessages) userInfo:nil repeats:YES]; 

如果我把應用背景,然後將其激活之前的定時器是由於火,那麼它會繼續,沒有任何問題運行。但是如果我把應用程序放在後臺,然後等待30,那麼當我回到應用程序時,定時器不會再次啓動。

+0

我不明白是什麼阻止你的計時器觸發。你可以發佈一些代碼,你已經設置你的計時器,還有代碼是你釋放它還是使其失效?謝謝! –

+0

添加代碼來解釋計時器問題。 – Fogmeister

回答

4

你可以聽這些NSNotifications,只是無效並恢復計時器,當應用程序離開和進入運行狀態:

UIApplicationDidBecomeActiveNotification 
UIApplicationWillResignActiveNotification 

另外,還要確保NSTimer的屬性是strong使計時器沒有按沒有獲得釋放。

@property (strong) NSTimer *timer; 

解決您的問題的另一種方法是使用第三方排隊類或庫。例如IFOfflineQueue

+0

啊,我沒有想過這樣做!我想我會通過使用通知來完成它。 – Fogmeister

+0

或者你可以簡單地啓動你的計時器在-viewDidAppear – Oleg

+0

我試過這種方法,並得到了一些奇怪的結果。結果我所需要做的就是將計時器作爲單身人士的強大財產存儲,當我安排它時。如果您編輯您的答案以添加此內容,我會接受:D,因爲您幫助我找到答案。 – Fogmeister