1

我的应用程序中有应用程序状态保存和恢复工作。恢复是相当 CPU 密集型的,在支持的最旧设备上,恢复应用程序状态可能需要 5 秒,所以我想在恢复应用程序状态时显示一个活动指示器。

在正在恢复的视图控制器中,我尝试过:

override public func decodeRestorableStateWithCoder(coder: NSCoder) {
    showActivityIndicator() 
    //just creates and adds UIActivityIndicatorView to view controller's view
    ...
}

override public func applicationFinishedRestoringState() {
    hideActivityIndicator()
}

我还尝试将其添加到UIWindowApp Delegate 中:

func application(application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool
    showActivityIndicator() 
}

但在这两种情况下,都没有显示活动指示器。我猜该应用程序在恢复时不会更新其视图状态。

有没有人在恢复应用程序状态时设法显示活动指示器,如果是这样怎么办?

4

2 回答 2

0

如果您的恢复过程在主线程上执行,那么就有可能没有显示活动指示器。

尝试在后台线程上执行恢复过程。

于 2017-03-25T06:57:36.440 回答
0

在状态恢复期间,您看到的不是应用程序的视图,而是在状态保留时拍摄的 UI 快照图像。因此,您在恢复期间对视图所做的任何更改(包括活动指示器)都不会被看到。

作为状态保存过程的一部分,UIKit 会捕获应用程序的用户界面并将其存储在图像文件中。当您的应用程序重新启动时,系统会显示此快照图像来代替您应用程序的默认启动图像,以保留您的应用程序仍在运行的概念。

(来自:ignoreSnapshotOnNextApplicationLaunch() 的文档

相反,您可以使用 UIApplicationWillResignActive 通知捕捉应用程序进入后台并对视图进行更改,以便它们保留在稍后将在恢复时出现的快照中。这对于执行诸如禁用按钮之类的操作很有用,以便用户可以看到他们在恢复期间无法与应用程序交互。然后在应用程序再次完全活动时根据需要重新启用这些按钮。但是,如果您在此处添加活动指示器,它将不会动画。

或者,您可以使用上面链接的 ignoreSnapshotOnNextApplicationLaunch() 在状态恢复期间显示您的启动屏幕,以使您的用户清楚他们无法交互 - 当恢复完成时,这将消失到您恢复的视图。

于 2017-10-07T13:46:00.120 回答