在applicationDidEnterBackground上调度保存操作:

问题描述 投票:4回答:2

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方法是完全执行还是中断?

ios multithreading grand-central-dispatch multitasking
2个回答
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分钟。在十分钟结束时,调用到期处理程序。

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


0
投票

我将使用不同类型的日志记录,以确保:

Flexible iOS Logging

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

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.