【问题标题】:Dispatched Saving operations on applicationDidEnterBackground:在 applicationDidEnterBackground 上调度保存操作:
【发布时间】:2013-02-19 04:43:55
【问题描述】:

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


    【解决方案1】:

    确保将 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. 是否需要 UIApplicationExitsOnSuspend?我没有设置它并调用了applicationDidEnterBackground:。 2、bgTask不应该声明为块变量,在[self performOperation]之后的调度块中也应该调用[app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid;吗? 3、用户在操作完成前或后台任务结束前再次点击应用会发生什么?
    • 1.除非您希望更改默认行为,否则不需要 UIApplicationExitsOnSuspend,我只是确保您知道它/没有在不知道等情况下将其设置为不同... 2.您是对的,bgTask 应该是一个块变量我进行了编辑。 3. 如果用户进入前台,则从不调用计划的过期处理程序,因为后台任务没有过期。而是调用 ApplicationDidEnterForeground。您在调度队列上执行的操作不会受到影响,因为在所有这些过程中应用程序一直处于活动状态,它将按需要进行。
    【解决方案2】:

    为了确定,我将使用不同类型的日志记录:

    Flexible iOS Logging

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-06
      • 2017-06-08
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多