在applicationDidEnterBackground上调度保存操作:

时间:2013-03-04 22:50:07

标签: ios multithreading grand-central-dispatch multitasking

Apple的"App States and Multitasking"文档(“移动到后台时应该做什么”一节)说当应用程序转到后台时保存:

  

保存用户数据和应用状态信息。进入后台时,应将所有未保存的更改写入磁盘。此步骤是必要的,因为您的应用可能会因为各种原因而在后台安静地被杀死。您可以根据需要从后台线程执行此操作。

当我开始调度操作时,例如对于保存需要花费一些时间在applicationDidEnterBackground:,如下所示我按下主页按钮时没有得到NSLog输出。返回应用程序后,将显示NSLog输出。

- (void)applicationDidEnterBackground:(UIApplication *)application {
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self performOperation];
         NSLog(@"Operation finished");
      });
}

我可以确定performOperation方法是完全执行还是在应用进入睡眠模式时中断?

2 个答案:

答案 0 :(得分:6)

确保将plist密钥设置UIApplicationExitsOnSuspend设置为no,以确保调用applicationDidEnterBackground

接下来确保你开始一个长时间运行的任务。在你的情况下,它看起来像这样:

- (void)applicationDidEnterBackground:(UIApplication *)application {
   UIBackgroundTaskIdentifier __block bgTask = nil;
   UIApplication  *app = [UIApplication sharedApplication];
   bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
         [app endBackgroundTask:bgTask]; 
         bgTask = UIBackgroundTaskInvalid;
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self performOperation];
         NSLog(@"Operation finished");
     });
 }

这样你告诉应用程序在你完成时会闲逛10分钟。在十分钟结束时,将调用到期处理程序。

此外,您可以设置所需的背景模式键以获得更多时间。有很多黑客和变种,可以让你有更多的时间使用我上面提到的东西。

答案 1 :(得分:0)

我将使用不同类型的日志来确保:

Flexible iOS Logging

通过将此日志记录添加到项目中,无论您是否正在调试,都可以通过转到管理器来检查项目的日志 - >设备 - > “您的设备” - >控制台。

我认为这是最好的方式,当我不确定是否可以调试时,它对我帮助很大。