2012-05-27 221 views
2

当应用程序进入后台状态时,我需要在后台安排任务。 我必须这样做才能每x次调用一次远程服务,然后在远程服务发生某些事件时显示本地通知。 (我知道这看起来像RPN,的确是这样,但由于某种原因,我无法使用PRM)当应用程序进入后台时运行后台线程

我试过这段代码:

- (void)applicationDidEnterBackground:(UIApplication *)application{ 

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){ 
     remoteServiceCallThread = [[NSThread alloc] initWithTarget:self selector:@selector(doRemoteCall:) object:nil]; 
     [remoteServiceCallThread start]; 
    }]; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application{ 
    [remoteServiceCallThread cancel]; 
} 

我把断点在doRemoteCall选择,把不管用。

也许我的方法不是最好的。如果你有任何其他手段像我描述的那样做这个操作,我会接受它。

谢谢。

回答

2

你是不是启动线程,它的初始化代码是在到期处理程序块将被称为右侧前应用程序被关闭了超时:

处理程序进行前,应用程序的简称为剩余的 后台时间达到0.你应该使用这个处理程序来清理和 标记后台任务的结束。未能明确结束任务 将导致应用程序终止。 处理程序在主线程中同步调用,因此在应用程序通知 时暂时阻止 应用程序暂停。

的任务应该是只有10分钟的活动状态(即由iOS的驱动)如果您的应用程序不支持后台模式(GPS,音频,VOIP)中的一个。

您还需要保持返回的UIBackgroundTaskIdentifier引用能够将其标记为结束,如果用户将应用程序置于前台或任务时间结束时(即处理程序块被调用时)。

+0

谢谢你的解释。但是这并不能告诉我如何在应用程序不在前台时设计我的解决方案来运行后台进程。 –

+0

把代码放在'beginBackgroundTaskWithExpirationHandler'后面,它会在应用程序通知系统需要处理后台操作时处理。 'beginBackgroundTaskWithExpirationHandler'可能在任何地方被调用,不仅在'applicationDidEnterBackground',这样你可以保护你的数据源操作不被终止。 –