如何将 plist 保存到 NSUserDefaults

2024-02-08

我正在尝试保存一个.plist我已经创建到我的NSUserDefaults这样我就可以保存要放入其中的数据,因此如果应用程序停止(从多任务栏删除),我不会丢失这些值。

我被指出了这个教程here http://www.cocoadev.com/index.pl?NSUserDefaults

其中有这个示例代码。

-(void)saveToUserDefaults:(NSString*)myString
{
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

    if (standardUserDefaults) {
        [standardUserDefaults setObject:myString forKey:@"Prefs"];
        [standardUserDefaults synchronize];
    }
}

-(NSString*)retrieveFromUserDefaults
{
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
    NSString *val = nil;

    if (standardUserDefaults) 
        val = [standardUserDefaults objectForKey:@"Prefs"];

    return val;
}

我需要帮助的是上述内容与储蓄有何关系.plists?

我有一个.plist读取包的控制器类.plist创建一个新的.plist在根文档中然后读取并写入...我如何在应用程序时使用上面的内容来保存它 退出或关闭?

这就是我加载和写入的方式.plist,目前使用单例并且它在自己的类中。

#pragma mark Singleton Methods
+ (id)sharedManager {
    @synchronized(self) {
        if (sharedMyManager == nil)
            sharedMyManager = [[self alloc] init];
    }
    return sharedMyManager;
}
- (id)init {
    if (self = [super init]) {

        // Data.plist code
        // get paths from root direcory
        NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        // get documents path
        NSString *documentsPath = [paths objectAtIndex:0];
        // get the path to our Data/plist file
        NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"];

        // check to see if Data.plist exists in documents
        if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath])
        {
            // if not in documents, get property list from main bundle
            plistPath = [[NSBundle mainBundle] pathForResource:@"EngineProperties" ofType:@"plist"];
        }

        // read property list into memory as an NSData object
        NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
        NSString *errorDesc = nil;
        NSPropertyListFormat format;
        // convert static property liost into dictionary object
        NSDictionary *tempRoot = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
        if (!tempRoot)
        {
            NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
        }
        // assign values
        self.signature = [tempRoot objectForKey:@"Signature"];
        self.version = [tempRoot objectForKey:@"Version"];
        self.request = [tempRoot objectForKey:@"Request"];
        self.dataVersion = [tempRoot objectForKey:@"Data Version"];

        man = [cacheValue objectForKey:@"Man"];
        mod = [cacheValue objectForKey:@"Mod"];
        sub = [cacheValue objectForKey:@"SubMod"];

        cacheValue = [tempRoot objectForKey:@"Cache Value"];
    }


    - (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue;
    {
        // get paths from root direcory
        NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        // get documents path
        NSString *documentsPath = [paths objectAtIndex:0];
        // get the path to our Data/plist file
        NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"];

        // set the variables to the values in the text fields
        self.signature = pSignature;
        self.version = pVersion;
        self.request = rNumber;
        self.dataVersion = dvReturned;

        //do some if statment stuff here to put the cache in the right place or what have you.
        if (methodName == @"manufacturers")
        {
            self.man = cValue; 
        }
        else if (methodName == @"models")
        {
            self.mod = cValue;
        }
        else if (methodName == @"subMod")
        {
            self.sub = cValue;
        }

        self.cacheValue = [NSDictionary dictionaryWithObjectsAndKeys:
                           man, @"Manufacturers",
                           mod, @"Models",
                           sub, @"SubModels", nil];


        NSDictionary *plistDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                   signature, @"Signature",
                                   version, @"Version",
                                   request, @"Request",
                                   dataVersion, @"Data Version",
                                   cacheValue, @"Cache Value", nil];



        NSString *error = nil;
        // create NSData from dictionary
        NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

        // check is plistData exists
        if(plistData)
        {
            // write plistData to our Data.plist file
            [plistData writeToFile:plistPath atomically:YES];

            NSString *myString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding];
            //        NSLog(@"%@", myString);
        }
        else
        {
            NSLog(@"Error in saveData: %@", error);
            //        [error release];
        }
    }


    @end

你不能写一个.plist into NSUserDefaults,至少实际上不是。为了实现这一点,你必须从.plist into NSUserDefaults这基本上就像保存所有数据的两个副本一样。你可以想到NSUserDefaults作为一个看不见的.plist您可以读取和写入该文件,而无需实际查看该文件。使用NSUserDefaults,即使应用程序在多任务处理中被终止,您也可以恢复保存的值。

然而,你如何选择.plist and NSUserDefaults应基于您需要保存的数据量。 Apple 建议仅保存少量数据NSUserDefaults。如果您需要保存大量信息那么.plist是要走的路。要么那样,要么当然Core-Data.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 plist 保存到 NSUserDefaults 的相关文章

随机推荐

  • Android 在可扩展列表视图中禁用自动滚动

    我在可扩展列表视图中使用 当我打开列表视图中的某个项目时 我的滚动会自动聚焦在打开的项目上 我可以阻止列表聚焦在新项目上并停留在同一个地方吗 我尝试从打开的视图中删除可聚焦的内容 但它不起作用 您需要重写 OnGroupClickListe
  • 无法从 EC2 实例元数据服务检索凭证

    我正在尝试使用 SDK 通过 AWS SES API 发送电子邮件 我的代码基于此处的官方文档 https docs aws amazon com ses latest DeveloperGuide examples send using
  • 最少使用的 unicode 分隔符

    我正在尝试在特定位置使用分隔符标记我的文本 稍后将使用该分隔符进行解析 我想使用最不常用的分隔符 我当前正在查看 2 或 U 0002 字符 使用起来足够安全吗 还有哪些其他建议 文本为 unicode 同时包含英语和非英语字符 A想要使用
  • 字体真棒图标在 Chrome 中显示为正方形?

    我正在尝试在按钮中使用字体很棒的图标 该图标在 Firefox 中工作正常 但当我在 Chrome 中使用它时 它显示为正方形 我环顾四周 唯一发现的是字体的路径可能不正确 但我后来尝试了 cdn 版本here http www boots
  • PacMan:主要使用哪些启发式方法?

    除了 A BFS DFS 等之外 Pacman 中还广泛使用其他哪些好的寻路算法 启发式算法 如果吃豆人可以找到不止一种水果 我认为我提到的那些不会起作用 我需要一些好的寻路算法 PacMan 可以使用它们以尽可能少的步数完成迷宫 我试图四
  • 接口上的属性有什么用?

    使用 Resharper 我提取了现有类的接口 这个类在一些成员上设置了一些属性 Resharper 也将这些属性放在接口成员上 我可以从界面中删除这些属性吗 实现接口时不会继承接口上的属性 对吧 它们不被实现类使用 但仍然可能很关键 例如
  • 反应路由器索引路由始终处于活动状态

    我正在尝试使用 React 来设计我的导航activeClassName属性 到目前为止 它按预期工作 但有一个问题 我的第一个导航链接指向根路线 因此 即使在另一个 URL 上 它也会将该 URL 例如 skills 和 root 注册为
  • JQUERY UI - 根据验证选择选项卡

    我将 Jquery UI 选项卡式表单与需要验证的每个选项卡上的输入放在一起 理想情况下 我想验证当前可见的选项卡 然后选择下一个不验证的选项卡 最好的方法是什么 我的代码如下 div ul li a href tab1 One a li
  • 发送带有源端口但不绑定的 UDP 数据包

    我想在 Python 中发送 UDP 数据包并指定源端口但不绑定 与 hping3 等效 hping3 s sourceport p remoteport udp file message bin d 1024 c 1 remoteaddr
  • Googletest Eclipse C++:如何同时具有测试和生产可执行文件?

    我有一个基本问题谷歌测试 https code google com p googletest 在 Eclipse 中 我正在使用测试运行者 https github com xgsa cdt tests runner wiki Tutor
  • 在控制台中访问新的 ember 路由器

    是否有等效的函数可以使用 ember 中的新路由器在控制台中获取 currentPath 之前 我能够做到这一点 App router get currentPath 但是 似乎使用新路由器 您无法以相同的方式访问路由器 事实上 App r
  • 使用 OpenSSL 将现有 TCP 套接字转换为 TLS

    我需要一些有关 OpenSSL TLS 套接字的信息 首先 我想通过 TCP 上的 TLS 与服务器建立连接 通常首先创建一个 TCP 套接字 然后使用 TCP 套接字连接到服务器 然后将 TCP 套接字转换为 TLS 在通过 TCP 套接
  • 根据父高度调整 Imageview 的大小

    我有一个如下定义的布局
  • 如何为 iPhone 创建自定义弹出窗口?

    I want to create a custom popup window for iPhone which should look like this 对于 iPhone 和 iPod 设备来说 最正确的实现方法是什么 执行此操作的最佳
  • 在图库中找不到图像

    我需要测试一个需要从 Android JellyBean 模拟器图库中选取一些图像的功能 所以我使用模拟器自己的浏览器 速度太慢了 从互联网上下载了一些图像 图像出现在下载的文件中 但不出现在模拟器图库中 在 GingerBread 模拟器
  • C# 和 PHP 上的三重 DES 加密会产生不同的结果

    我正在编写一个简单的登录加密系统 但有一个小问题 C 加密函数 public static string EncryptString string Message string Passphrase byte Results System
  • 如何在tcl中执行子字符串提取和替换

    我正在尝试从 Tcl 中的字符串中提取子字符串 我编写了代码并且能够做到这一点 但我想知道是否还有其他有效的方法来做到这一点 所以确切的问题是我有一个字符串 name ext 10a string 10a string string str
  • Java中的透明圆形对话框

    我正在用 Java 构建一个 Poker Odds Calc 应用程序 我想通过单击卡的占位符来选择一张新卡 该占位符基本上是一个扩展的 JPanel 我 绘制 卡的表面并有一个 mouseListener 我想做的是 当我单击该卡时 我希
  • android:无法将只读数据库从版本0升级到1

    我知道有很多主题具有相同的标题 但我已经尝试了所有主题 我无法解决我的问题 我得到的错误正是这样的 android database sqlite SQLiteException 无法将只读数据库从版本0升级到1 data data com
  • 如何将 plist 保存到 NSUserDefaults

    我正在尝试保存一个 plist我已经创建到我的NSUserDefaults这样我就可以保存要放入其中的数据 因此如果应用程序停止 从多任务栏删除 我不会丢失这些值 我被指出了这个教程here http www cocoadev com in