ios - 如何在 iOS 上存储我的游戏数据(全局状态)以避免损坏?

标签 ios

我正在制作一款游戏,我需要在游戏发布之间存储许多值 - 玩家赚取的货币数量、他解锁的内容以及许多其他内容。

我选择的路线是序列化我的数据并将其存储在磁盘上。

所以我把我的状态保存在

- (void)applicationWillResignActive:(UIApplication *)application

方法,并在每次我的游戏开始时恢复它。我通过实现以下方法序列化数据:

- (instancetype)initWithCoder:(NSCoder *)coder
- (void)encodeWithCoder:(NSCoder *)coder

我对这种方法有几个问题:

  1. 我使用这种方法原子写入磁盘:

    [数据 writeToFile:docPath options:NSDataWritingAtomic error:&error];

据我了解,这或多或少可以保证我的数据不会中途停止写入并损坏?这是否可以避免游戏在保存过程中崩溃?

  1. 如果我的数据损坏,我如何检测到它,这是否可能以及我如何优雅地恢复?

  2. 也许有另一种方法可以完成我想要完成的事情?

最佳答案

我认为当您的应用程序崩溃时,操作系统会终止所有事件线程。如果发生这种情况时写入正在进行,则写入将被破坏。

NSDataWritingAtomic 不保证写入成功,只是你不会在磁盘上看到损坏的、部分写入的文件。一种常见的模式是写入临时保存文件,然后(成功后)删除旧的保存文件,然后(成功后)重命名临时文件。在内部,NSDataWritingAtomic 做了类似的事情:它首先将您的数据写入一个临时文件,然后与目标交换临时文件。

也就是说,保留旧的保存文件可能很有用。您可以使用一种命名方案,让您将旧的保存文件保留在磁盘上,无论是一个、十个还是十亿个。

If my data corrupts, how do I detect this, is this even possible and how do I gracefully restore?

您不会知道数据已损坏。很可能该应用程序刚刚被杀死,而您没有任何迹象表明上一个 session 甚至已经发生。这就是为什么您需要适当的策略,以便写入失败不会永久破坏有用的信息,例如将旧的保存文件留在适当的位置。

Maybe there is another way to do what I'm trying to accomplish?

如上所述。或者:核心数据。或者:将数据保存到首选项。

关于ios - 如何在 iOS 上存储我的游戏数据(全局状态)以避免损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23832635/

相关文章:

ios - 带有 Cordova 应用程序的 Azure 通知中心 (iOS)

ios - 我没有编辑的 UITableViewCell(不可见的部分)也被编辑了。

ios - Xcode 8 : aps-environment is missing from the archived app

ios - UIView 不会以编程方式移动

iphone - 在没有 iPhone 的情况下测试 iPhone 应用程序

ios - xCode 8 中裁剪的 iPad 模拟器

ios - iOS 中的内存泄漏,AVPlayer 永远不会被释放

ios - 如果一个文本字段已添加到单元格,如何不创建新的文本字段

ios - 在范围内找不到类型 'GADRequestError'

ios - 如何使 UILabel 和 UITextField 字体大小相对于屏幕大小