需要有关 iOS 后台执行的帮助

Need assistance regarding iOS Background Execution

我的 ViewController 以模态方式显示有一个保存按钮,可以将数据保存在数据库中,然后 unwind ViewController

我还从 applicationDidEnterBackground 发布了一个 notification 来调用 save method 所以如果用户没有点击保存按钮并点击 iPhone home button 用户数据已保存。

就像 Apple Doc 建议

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task, preferably in chunks.

        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

问题 1: 我的任务不是那么长,在DB中保存几百行需要几秒钟,是否还需要放入dispatch_async中?

问题二: 用户可以点击保存按钮并立即点击 iPhone 主页按钮,在这种情况下,我的保存方法将被调用两次,这对我的应用程序不利,我应该使用 dispatch_once 还是有其他方法?

问题 3 苹果文档说:

Failure to call the endBackgroundTask: method for a background task will result in the termination of your app. If you provided an expiration handler when starting the task, the system calls that handler and gives you one last chance to end the task and avoid termination.

  1. 如果我的应用程序是 运行 并且未调用 endBackgroundTask: 会 iOS 使应用程序崩溃吗?
  2. avoid termination 是什么意思,如果我的应用程序在后台并且我的任务也已完成,iOS 将使我的应用程序保持活动状态并防止终止它?

问题 4 在使用此 backgroudtask 时进入后台后我的应用程序将保持功能多长时间?因为 Apple 在评论中提到 // Start the long-running task and return immediately.

问题 1

如果你的操作用时少于 5 秒(根据 Documentation),你可以不用 beginBackgroundTaskWithNamedispatch_async,但你必须考虑该数据是否正在运行随着时间的推移而增加,如果是这种情况,那么你最好使用 beginBackgroundTaskWithNamedispatch_async.

问题二

我会做的是在 NSUserDefaults 中存储一个关于保存操作的标志,这样如果保存操作仍在进行中,您可以避免再次尝试保存它。

问题 3

1.- 如前所述,您的应用程序将被终止并从内存中清除,因为当您不再需要它时您仍在保留资源。

2.- 通常,当用户离开您的应用程序时,您的应用程序仍然可以 运行 不时在后台执行某些操作,或者如果您启用了该模式,则可以响应推送通知。但是,如果您的应用程序被用户或 OS 终止,那么您将无法

问题4

遗憾的是在文档中没有关于它的规范,但你可以放心,如果你使用 beginBackgroundTaskWithName.

,它会超过 5 秒

希望这能消除任何疑问。

干杯

-----编辑 1-----

如@Paulw11所述,对于问题4,"it is currently 3 minutes and you can examine the UIApplication property backgroundTimeRemaining to determine how much time is left."