如何在iOS中保存数据

Cen*_*noX 23 persistence ios

我正在制作游戏,当我关闭应用程序时(关闭多任务管理器),我的所有数据都消失了!所以,我的问题很简单:如何保存数据?

Rok*_*arc 26

假设您要保存得分和级别,这两者都是名为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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

不要忘记在需要的地方#import"DataHolder.h",或者简单地把它放进去...-Prefix.pch.

您可以在appDelegate方法中执行实际加载和保存:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[DataHolder sharedInstance] saveData];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [[DataHolder sharedInstance] loadData];
}
Run Code Online (Sandbox Code Playgroud)

您可以从任何地方访问你的分数和级别的数据[DataHolder sharedInstance].score[DataHolder sharedInstance].level.

这似乎是一个简单的任务矫枉过正,但它肯定有助于保持整洁,它可以帮助你避免保存所有的数据appDelegate(通常是快速和肮脏的路径解决方案).


Cli*_*udo 10

[NSUserDefaults standardUserDefaults]适用于少量数据,如用户设置和首选项.通常,您可以使用它来保存用户保存定义全局值的各种数据,例如角色首选项,武器首选项等等.

对于大量数据,如游戏级别的详细信息或成就或武器库存等,您将需要使用类似核心数据的内容.这是一个更正式的数据库,可以在数据模式更改时轻松迁移.请参阅此处的文档: 核心数据核心数据编程指南


Adn*_*tab 9

您可以在CoreData,SqlLite或NSUserDefaults中保存数据 更新 Realm也是一个选项并且非常容易实现.

  • 或者是一个简单的平面文件,可能包含JSON表示或CSV格式的数据. (9认同)