2014-10-16 86 views
0

在我的應用程序中,我有一個NSTimer和一個選擇器- (void)TimerCount。我也有一個整數int CountNum,每0.01秒,它增加1(CountNum = CountNum + 1)。如何運行計時器認爲應用程序進入後臺或終止

Timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(TimerCount) userInfo:nil repeats:YES]; 

而且我希望定時器恢復原來的應用程序被終止或它進入後臺。我怎樣才能做到這一點?

回答

1

如果您的應用程序是終止,您將無法繼續處理。要在後臺運行,有一些諸如後臺任務之類的事情,但聽起來你的用例不能保證它們。由於您的增量是線性的且可計算的,因此您可以將開始日期指定爲NSUserDefaults,然後在應用程序恢復並更新計數時加載它。

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]] forKey:@"start_time"]; 
NSNumber *start = [[NSUserDefaults standardUserDefaults] objectForKey:@"start_time"]; 
countNum = ceil([[NSDate date] timeIntervalSince1970] * 100) - ceil([start doubleValue] * 100); 
0

您可以使用NSuserdefaults來保存您的countNum,無論用戶什麼時候退出應用程序,它都將被保存。只要打電話到這一點的appdelegate功能- (void)applicationWillTerminate:(UIApplication *)application {

NSUserDefault *defaults = [NSUser Defaults standardUserDefaults]; 
[defaults setInteger: countNum forKeys:@"ANY_KEY_HERE"]; 
[defaults synchronise]; 

上面的代碼將節省您的countNum,但你必須保存它,當用戶將終止或進入後臺。

而當用戶將進入前臺,你可以打電話擷取您countNum

NSUserDefault *defaults = [NSUser Defaults standardUserDefaults]; 
yourCountNum = [default getIntegerForKeys: @"ANY_KEY_HERE"]; 
1

一對夫婦的想法:

  1. 一般來說,你不會試圖維持定時去。如果您不需要,您應該避免讓應用程序在後臺執行任何操作。您不必要地耗盡用戶的系統資源(電池,內存,CPU週期等)。

  2. 如果您需要在應用程序可能未運行時(例如,這是一個倒計時或類似警報的功能)在未來的時間點獲得用戶的關注,請使用location notification而不是使用計時器。另外,如果您試圖記錄已經過了多長時間,則使用NSTimer不是正確的解決方案(特別是如果您每秒鐘啓動100次)。捕獲開始時間,然後當您想要確定已經過了多長時間時,那麼在任何未來的時間點,您都可以獲取當前時間並將其與開始時間進行比較。

    這種方法的美妙之處在於您不再關心您執行此過程的頻率。如果你正在更新UI,你可以每秒調用60次。如果應用程序在後臺,那麼在應用程序重新啓動前臺之前,您無需執行任何操作(只需將啓動時間保存在持久性存儲中,例如NSUserDefaults,然後在應用程序再次啓動時再次檢索) 。底線,通過從「計數器」方法轉移到「比較當前時間到開始時間」的方法,您可以將UI從計時器中分離出來。不用說,一旦你這樣做了,當應用程序離開前臺時根本不需要定時器。

如果你絕對需要的計時器,當應用程序離開前臺運行,有辦法做到這一點(如要求幾分鐘就可以完成一些有限長度的任務),但只有這樣做,如果你絕對需要。如果你只是更新一個櫃檯,那麼你肯定不想那麼做。

相關問題