应用程序在iOS上输入后台时继续操作

Pie*_*ero 8 background-process nsoperation ios

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

beginBackgroundTaskWithExpirationHandler
Run Code Online (Sandbox Code Playgroud)

这是一个来自苹果的方法,当应用程序处于后台模式时,让我们继续执行某项任务,并且我这样做:

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

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

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
}];
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

rma*_*ddy 14

那不是你怎么做的.您要在后台运行的任何代码都必须正确包装.像这样的东西:

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)

您不在该UIApplicationDelegate applicationDidEnterBackground:方法中执行任何操作.

当应用程序进入后台时,允许在"后台任务"调用中包含的任何任务继续运行.

这是非常重要的部分 - 任务最多只能达到10分钟.如果它在10分钟后仍在运行,您的应用将被终止.在不正确地终止应用程序之前,到期处理程序会让您在几秒钟内干净地结束任务.