我正在制作一款游戏,我需要在游戏发布之间存储许多值 - 玩家赚取的货币数量、他解锁的内容以及许多其他内容。
我选择的路线是序列化我的数据并将其存储在磁盘上。
所以我把我的状态保存在
- (void)applicationWillResignActive:(UIApplication *)application
方法,并在每次我的游戏开始时恢复它。我通过实现以下方法序列化数据:
- (instancetype)initWithCoder:(NSCoder *)coder
- (void)encodeWithCoder:(NSCoder *)coder
我对这种方法有几个问题:
我使用这种方法原子写入磁盘:
[数据 writeToFile:docPath options:NSDataWritingAtomic error:&error];
据我了解,这或多或少可以保证我的数据不会中途停止写入并损坏?这是否可以避免游戏在保存过程中崩溃?
如果我的数据损坏,我如何检测到它,这是否可能以及我如何优雅地恢复?
也许有另一种方法可以完成我想要完成的事情?
最佳答案
我认为当您的应用程序崩溃时,操作系统会终止所有事件线程。如果发生这种情况时写入正在进行,则写入将被破坏。
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/