【问题标题】:How to save data in iOS如何在 iOS 中保存数据
【发布时间】:2018-01-15 19:43:26
【问题描述】:

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

【问题讨论】:

  • 您要保存什么类型的数据以及保存多少?

标签: ios persistence


【解决方案1】:

假设您要保存分数和级别,它们都是名为 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 中(这通常是解决问题的快速而肮脏的途径)。

【讨论】:

    【解决方案2】:

    [NSUserDefaults standardUserDefaults] 适用于用户设置和偏好等少量数据。通常,您使用它来使用户能够保存定义全局值的各种数据位,例如角色偏好、武器偏好等。

    对于大量数据,例如游戏关卡详细信息或成就或武器库存等。您将需要使用 Core Data 之类的东西。这是一个更正式的数据库,可以在您的数据架构更改时轻松迁移。请参阅此处的文档: Core DataCore Data Programming Guide

    【讨论】:

      【解决方案3】:

      您可以将数据保存在 CoreData、SqlLite 或 NSUserDefaults 更新 Realm 也是一种选择,非常容易实现。

      【讨论】:

      • 或一个简单的平面文件,可能包含 JSON 表示或 CSV 格式的数据。
      • 哪一个是安全的?
      • 如果你有一些敏感的东西,那么不要将它存储在 NSUserDefaults 中。尝试保存其他数据,例如 Realm sql 或核心数据并使用加密。如果你有一些东西,比如令牌用户名和密码,请使用钥匙串
      【解决方案4】:

      在 ios 中保存数据的方法很少。

      1. UserDefaults - 保存少量数据的好方法。
      2. 钥匙串 - 用于保护登录数据和密码等敏感数据的安全位置。
      3. Sqlite 数据库 - 如果您的应用程序有大量结构化数据
      4. CoreData - 基于描述应保存的对象的对象图
      5. 保存文件 - 当然您也可以直接将所有类型的文件保存到文件系统中。但是,出于安全原因,您只能访问应用程序容器中的文件系统。
      6. 使用 Realm 数据库 - Core Data 和 SQLite db 的最佳替代品
      7. NSKeyedArchiver 和 NSKeyedUnarchiver - 处理少量对象的更好方法。 // 我是这么认为的

      参考-http://www.thomashanning.com/data-persistence-ios/

      【讨论】:

        【解决方案5】:

        斯威夫特 3

        使用UserDefaults

        UserDefaults.standard.set(„some value”, „key”)
        let value = UserDefaults.standard.string(„key”)
        

        你甚至可以使用这个持久化数组

        【讨论】:

          【解决方案6】:

          我建议使用Realm 以获得更通用的解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-05
            • 1970-01-01
            • 2021-10-07
            • 1970-01-01
            相关资源
            最近更新 更多