11

在我的应用程序中,我有一些 NSOperation 从在线数据库更新一些核心数据元素,有时更新需要一些时间,当 iPhone 屏幕锁定时,应用程序进入后台模式,并且此更新停止,所以我有重新打开应用程序以继续更新,所以我在堆栈溢出上搜索了很多,我找到了一些关于:

beginBackgroundTaskWithExpirationHandler

这是来自苹果的一种方法,当应用程序处于后台模式时也可以继续执行某些任务,我已经这样做了:

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

UIApplication  *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
}];
}

现在应用程序在后台继续执行任务,似乎一切正常,所以我的问题是,我使用的这种方法安全吗?还是有更好的模式?

谢谢

4

1 回答 1

16

这不是你这样做的方式。您想在后台运行的任何代码都必须正确包装。像这样的东西:

- (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 分钟后它仍在运行,您的应用程序将被终止。在应用程序被不干净地终止之前,过期处理程序会给您几秒钟的时间来干净地结束任务。

于 2012-11-26T23:46:11.157 回答