【发布时间】:2018-01-15 19:43:26
【问题描述】:
我正在制作游戏,当我关闭应用程序(在多任务管理器中关闭)时,我的所有数据都消失了!所以,我的问题很简单:如何保存数据?
【问题讨论】:
-
您要保存什么类型的数据以及保存多少?
标签: ios persistence
我正在制作游戏,当我关闭应用程序(在多任务管理器中关闭)时,我的所有数据都消失了!所以,我的问题很简单:如何保存数据?
【问题讨论】:
标签: ios persistence
假设您要保存分数和级别,它们都是名为 dataHolder 的对象的属性。
DataHolder 可以创建为单例,因此您不必担心从何处访问它(实际上是 sharedInstance):
它的代码看起来有点像这样:
DataHolder.h
#import <Foundation/Foundation.h>
@interface DataHolder : NSObject
+ (DataHolder *)sharedInstance;
@property (assign) int level;
@property (assign) int score;
-(void) saveData;
-(void) loadData;
@end
DataHolder.m
NSString * const kLevel = @"kLevel";
NSString * const kScore = @"kScore";
@implementation DataHolder
- (id) init
{
self = [super init];
if (self)
{
_level = 0;
_score = 0;
}
return self;
}
+ (DataHolder *)sharedInstance
{
static MDataHolder *_sharedInstance = nil;
static dispatch_once_t onceSecurePredicate;
dispatch_once(&onceSecurePredicate,^
{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
//in this example you are saving data to NSUserDefault's
//you could save it also to a file or to some more complex
//data structure: depends on what you need, really
-(void)saveData
{
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:self.score] forKey:kScore];
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:self.level] forKey:kLevel];
[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)loadData
{
if ([[NSUserDefaults standardUserDefaults] objectForKey:kScore])
{
self.score = [(NSNumber *)[[NSUserDefaults standardUserDefaults]
objectForKey:kScore] intValue];
self.level = [(NSNumber *)[[NSUserDefaults standardUserDefaults]
objectForKey:kLevel] intValue];
}
else
{
self.level = 0;
self.score = 0;
}
}
@end
别忘了在需要的地方#import "DataHolder.h",或者干脆把它放在...-Prefix.pch。
您可以在appDelegate 方法中执行实际加载和保存:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[DataHolder sharedInstance] saveData];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[DataHolder sharedInstance] loadData];
}
您可以在任何地方使用[DataHolder sharedInstance].score 和[DataHolder sharedInstance].level 访问您的分数和级别数据。
对于一项简单的任务来说,这似乎有点过头了,但它确实有助于保持整洁,并且可以帮助您避免将所有数据保存在 appDelegate 中(这通常是解决问题的快速而肮脏的途径)。
【讨论】:
[NSUserDefaults standardUserDefaults] 适用于用户设置和偏好等少量数据。通常,您使用它来使用户能够保存定义全局值的各种数据位,例如角色偏好、武器偏好等。
对于大量数据,例如游戏关卡详细信息或成就或武器库存等。您将需要使用 Core Data 之类的东西。这是一个更正式的数据库,可以在您的数据架构更改时轻松迁移。请参阅此处的文档: Core Data 和 Core Data Programming Guide
【讨论】:
您可以将数据保存在 CoreData、SqlLite 或 NSUserDefaults 更新 Realm 也是一种选择,非常容易实现。
【讨论】:
在 ios 中保存数据的方法很少。
【讨论】:
斯威夫特 3
UserDefaults.standard.set(„some value”, „key”)
let value = UserDefaults.standard.string(„key”)
你甚至可以使用这个持久化数组
【讨论】:
我建议使用Realm 以获得更通用的解决方案。
【讨论】: