应用程序进入/离开后台时保存和加载数据

Posted

技术标签:

【中文标题】应用程序进入/离开后台时保存和加载数据【英文标题】:Saving and loading data when application enters / leaves background 【发布时间】:2013-12-05 13:00:20 【问题描述】:

我正在尝试让我的游戏保持其当前状态并在用户退出或重新启动游戏时重新加载它。然而,我正在努力解决的是如何在正确的时间实际访问对象。这是我需要的伪代码,我似乎无法访问正确的对象,我是在倒退还是这样做是正确的方法?

所以重申一下,我的问题是访问正确的ViewControllers 以便从磁盘保存/加载数据。

我的导航层次结构很简单,ViewController > GameViewController(模态显示)

-(void)applicationDidEnterBackground:(UIApplication *)application

  // Save current state to disk

  // See if GameViewController (or GameView) is top controller (aka game in progress)
  // If so then use NSKeyedArchiver to persist to disk


-(void)applicationDidBecomeActive:(UIApplication *)application

  // Load current state from disk

  // Use NSKeyedArchiver to load data from disk, if game is in progress then
  // Find mainViewController, then show the game modal on top of it
  // then populate the game data with the data from disk

额外问题:这两个函数是我保存/加载的正确函数吗?

【问题讨论】:

为什么不让每个 viewController 成为应用程序委托中的一个属性? 我将如何实现这一目标? 在您的应用程序委托的头文件中(上述方法所在的位置)声明@property UIViewController *yourController;那么您可以根据需要访问您的 VC,并且您始终有参考... 谢谢,但我如何将属性绑定到我的 ViewControllers?顺便说一句,我正在使用界面生成器 将 NSMutableDictionary 设置为应用委托中的属性。在某个特定时间(如阶段完成)访问您的 VC 中的此字典变量。这里将您的游戏状态存储在字典中。然后在 applicationWillEnterBackground 中将您的字典数据写入本地数据中的 prefrences/plist。并在 applicationWillEnterForeground 从本地目录中读取并存储到您的字典变量中。 【参考方案1】:

或者,您可以在代码中任何您想要/需要的地方设置通知处理程序:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(handleEnteredBackground:) 
                                             name: UIApplicationDidEnterBackgroundNotification
                                           object: nil];

【讨论】:

【参考方案2】:

解决这个问题的正确方法是利用模型-视图-控制器模式 (MVC) - (几乎)所有优秀的 Cocoa ios 应用都应该:

首先,确保您想要保留的所有数据都存储在您的模型层/对象中。 如果视图控制器的状态频繁更改,请使用视图控制器中的通知:UIApplicationWillEnterBackgroundNotification 作为触发器将状态保存到模型。 当在应用委托中收到applicationDidEnterBackground: 消息时,将模型对象中的数据保存到文件系统中。 当应用程序唤醒或重新启动时,将文件数据加载回模型中并通过自定义通知通知视图控制器,以便视图控制器知道要恢复其相关状态。

应用程序委托不应四处挑选要保存到文件系统的每个视图控制器的信息。

【讨论】:

嗨,这很有意义,但是 GameViewController “拥有” GameEngine 模型,并且基本上每次显示视图时都会创建一个新模型,因此需要以某种方式提供/获取信息 太好了,所以在GameEngine 类中——假设它是你要修改的——你可以创建一个保存方法,将其状态保存到文件中。或者,如果您无法修改它,您可以在另一个类中保留 GameEngine 的集合(如果有多个),并在该类上有一个保存方法,将 GameEngine 的状态保存到文件中。 Mano Khahil 的上述评论提出了一种类似但更懒惰的做法。 是的,它是我的,是的,我可以很容易地做到这一点,我想我现在知道如何排序了,我会尝试一下,谢谢!

以上是关于应用程序进入/离开后台时保存和加载数据的主要内容,如果未能解决你的问题,请参考以下文章

当 iphone 应用程序进入后台或前台状态时,如何保存数据?

进入后台时停止相机录制并保存文件

在进入后台时将 UIDocument 上传到 iCloud

离开 Activity 时 Android 如何处理后台线程?

进入后台状态ios swift时防止websocket连接断开

在swift中,当应用程序进入后台时,如何使用依赖注入保存变量?