2012-01-20 34 views
11

我正在開發一個必須在後臺運行的應用程序。這是一個基於位置的應用程序,所以它一直運行,操作系統不會殺死它。iphone - 背景中的NSTimers

它應該每10秒發送一些信息(僅用於調試),我在後臺設置了一個定時器。我在應該每10秒執行一次的函數中設置一個斷點,這是永遠不會調用的,但是如果我暫停應用程序,然後繼續調用定時器,然後定時器每10秒執行一次,沒有問題,對不對?

我認爲計時器無論如何都是在我沒有調試的時候執行的,但它不是,就像我沒有暫停調試一樣。

我的問題是爲什麼?定時器設置正確(我假設),因爲它暫停後工作,但事實並非如此。

任何想法?

我設置定時器的方法是:

self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES]; 

而在功能我連接到一個Web服務。

謝謝。

+0

這是關於定時器,而不是調試;請修正你的頭銜,請。 「objective-c」是您爲標記此問題所能做的最好的事情嗎? – matt

+0

[NSTimers在後臺運行?]可能的重複?(http://stackoverflow.com/questions/5901398/nstimers-running-in-background) – matt

回答

20

我有一個類似的應用程序設計,並堅持在同一件事。我發現在互聯網上的某個地方是添加此類型的語句applicationDidEnterBackground:

UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:locationUpdater]; 
     locationUpdater=UIBackgroundTaskInvalid; 
    } ]; 

的這告訴你還有事去而不是阻止它的操作系統。

我有我的計時器連接到這個功能

//this is a wrapper method to fit the required selector signature 
- (void)timeIntervalEnded:(NSTimer*)timer { 
    [self writeToLog:[NSString stringWithFormat:@"Timer Ended On %@",[NSDate date]]]; 
    [self startReadingLocation]; 
    [timer invalidate]; 
    timer=nil; 
} 

我設置計時器在我的我的位置管理委託方法。

我感覺到你的痛苦。我發現這些東西超級挑剔。這對我來說很有用。我希望它有幫助。我發現在後臺可以做什麼沒有任何限制。

+0

非常感謝cwieland,它完美運作。 – subharb

+0

其實它並沒有解決我的整個問題。現在我得到了一個崩潰日誌,顯然是因爲我不會結束後臺任務,這是因爲只要應用程序在後臺,任務就永遠不會結束。 NStimer會重複一遍。那可能嗎?或者因爲它是一個位置應用程序,我應該將操作掛鉤到GPS? – subharb

+0

我不完全確定崩潰是從哪裏來的。我可以在後臺維護一個套接字連接,所以我非常肯定你不僅限於基於位置的事情。但正如我所說,這些問題不是最容易解決的問題。抱歉,我無法提供更多幫助。我的計時器將無休止地運行(據我觀察)有一件事要檢查是打印出backgroundTimeRemaining(它永遠不會下降,並且非常大) – utahwithak

0

可能會限制您在後臺執行的操作。在進入後臺之前,嘗試將計時器添加到運行循環中。即使這可能不起作用;您可能會在後臺運行的唯一代碼是您已註冊的Core Location方法調用的代碼(例如locationManager:didUpdate...)。但我的印象是,在開始進入後臺之前已經運行的定時器將繼續運行。

+0

但是,這不解釋爲什麼如果我調試它的作品。這是我不明白的。我認爲應用程序的行爲與調試或運行的方式相同 – subharb

+0

我相信,如果您嘗試了我的建議(在仍然處於前臺時設置計時器),它將解決問題。這實際上可能與您接受的解決方案相同。你的問題是你已經背對背,你的runloop已經停止運行,然後你設置了定時器。在斷點處暫停並在後臺恢復的同時讓runloop有一個新的運行機會,所以此時定時器被添加到runloop中。這是猜測,但我相信它解釋了這種現象。 – matt