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

时间:2016-03-18 15:29:23

标签: ios objective-c uiviewcontroller background-task

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

我还在notification发布applicationDidEnterBackground来呼叫save method,以便当用户没有点击保存按钮并点击iPhone home button用户数据gat时保存

就像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

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

问题3 Apple Doc说:

  

无法为后台任务调用endBackgroundTask:方法   将导致您的应用终止。如果你提供了   启动任务时到期处理程序,系统调用它   处理程序,并给你最后一次机会结束任务,避免   终止。

  1. 如果我的应用程序正在运行并且未调用endBackgroundTask:,那么iOS会使该应用程序崩溃吗?
  2. avoid termination是什么意思,如果我的应用程序处于后台并且我的任务也已完成,那么iOS会保持我的应用程序存活并阻止其终止吗?
  3. 问题4 我的应用在使用此backgroudtask后进入后台后保持功能的时间有多长?因为Apple在评论中提到// Start the long-running task and return immediately.

1 个答案:

答案 0 :(得分:2)

问题1

如果您的操作时间少于5秒(根据Documentation),则可以在没有beginBackgroundTaskWithNamedispatch_async的情况下执行此操作,但您必须考虑该数据是否会增加随着时间的推移,如果情况确实如此,那么最好使用beginBackgroundTaskWithNamedispatch_async进行此操作。

问题2

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

问题3

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

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

问题4

遗憾的是,文档中没有关于它的说明,但如果您使用beginBackgroundTaskWithName,则可以放心使用它超过5秒。

希望这能消除任何疑虑。

干杯

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

如@ Paulw11所述,对于问题4 ,“它目前是3分钟,您可以检查UIApplication属性backgroundTimeRemaining以确定剩余时间。”