2012-01-20 23 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