在我的应用我有一些的NSOperation从一个在线数据库更新一些核心数据元素,有时更新需要一些分,当iPhone锁屏,应用程序在后台模式进入,该更新被停止,所以我有重新打开应用程序继续更新,所以我有搜索在堆栈溢出了很多,我必须找到一些信息:
beginBackgroundTaskWithExpirationHandler
这是苹果的方法,让继续一些任务也当应用程序在后台模式,我也这样做:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
}
现在的应用程序继续在后台任务,似乎一切工作正常,所以我的问题是,这种方法我用的是安全的? 或者有更好的模式?
谢谢
那你是如何做到这一点并非如此。 要在后台运行任何代码必须妥善包装。 事情是这样的:
- (void)someMethodToKeepRunningInBackground {
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
// Uh-oh - we took too long. Stop task.
}];
// Perform task here
if (taskId != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:taskId];
}
}
你不是在做什么UIApplicationDelegate applicationDidEnterBackground:
方法。
被包裹在“后台任务”内的任何任务调用将被允许保留时,应用程序进入后台运行。
这里是真正重要的部分 - 任务只得到最多10分钟。 如果10分钟后仍在运行你的应用程序将被终止。 到期处理程序给你几秒钟的时间完全结束任务的应用程序是不清洁终止之前。