【问题标题】:Store a user profile in iOS app so that it's always accessible在 iOS 应用中存储用户个人资料,以便随时可以访问
【发布时间】:2014-05-24 19:27:15
【问题描述】:

我想创建一个用户,该应用程序每次打开应用程序时都会从磁盘获取,每次关闭时都会写入。我希望可以从应用程序中的任何其他点访问来自用户的数据,例如 NSString 名称以及其他一些变量。

只有一个用户,所以它是一种“全局”变量。另外,如果用户类包含指向数据结构的指针,如NSMutableDictionary,或NSObject 的另一个实例,我需要采取任何预防措施吗?

我想学习实现这一点的最佳方法,有什么建议吗?

【问题讨论】:

    标签: ios datastore


    【解决方案1】:

    1) 创建一个类来代表您的用户

    2) 让该类实现NSCoding 协议

    3) 根据需要使用NSFileManager 创建或打开文件

    4) 使用该文件来恢复/存储用户类。 (使用NSCoding 协议很容易)

    5) 使用户类归您的模型所有,该模型在用户类中公开数据,或者使用户类成为单例(第一个更好)。

    如果您使用NSCoding搜索如何存储东西,您应该能够找到示例/教程

    【讨论】:

    • 你能解释一下我是如何让模型拥有用户类的吗?我对公开数据的模型感到困惑
    • 研究MVC模式(模型视图控制器)
    • 好的,所以我的视图控制器有一个用户对象,我在启动或终止时从应用程序委托中的文件加载我的用户,如何将我的用户从委托传递到我的视图控制器(或多个),还是我将它们全部分组到导航控制器中并将我的用户分配给它?
    【解决方案2】:

    您可以创建一个由 NSObject 扩展的 UserObject。使用Singleton Pattern,这样您在每个类中始终拥有相同的对象。

    然后您可以使用特定的key 将每个变量保存在NSUserDefaults 中。 如果要将整个对象保存在NSUserDefaults 中,则需要在界面中包含NSCoding

    @interfaces User : NSObject <NSCoding>
    

    并使用initWithCode:encodeWithCoder方法:

    - (id)initWithCoder:(NSCoder *)aDecoder{
        self = [super init];
        if( self ){
            strName = [aDecoder decodeObjectForKey:@"name"];
        }
        return self;
    }
    
    - (void)encodeWithCoder:(NSCoder *)aCoder{
        [aCoder encodeObject:strName forKey:@"name"];
    }
    

    对于联合国/归档这样做:

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:userObject];
    
    UserObject *user = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    

    如果您想了解更多信息,请can read all about it here

    【讨论】:

      【解决方案3】:

      NSUserDefaults 是你的朋友。它满足您从应用程序中的任何其他点访问的要求。

      【讨论】:

      • 如果数据包含动态数据结构,我个人不会使用 NSUserDefaults。
      • @Piepants 请你解释一下,为什么 NSUserDefaults 不是存储动态内容的好选择。
      【解决方案4】:

      如果有私人用户数据要存储,请使用钥匙串。 在大多数情况下,马丁的答案是最好的方法。

      【讨论】:

        【解决方案5】:

        NSUserDefaults 是一个不错的选择。您可以从应用程序的每个点访问它,随时保存和提取数据,并存储您可能需要的大部分内容。

        保存:

        NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
        [userDef setObject:userDictionary forKey:@"userData"];
        [userDef synchronize];
        

        提取:

        NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
        NSDictionary *userDictionary = [userDef objectForKey:@"userData"];
        

        您可以将数据保存在 AppDelegate 上

        - (void)applicationWillTerminate:(UIApplication *)application;
        

        然后提取:

        - (void)applicationWillEnterForeground:(UIApplication *)application;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多