前言
在实际的iOS开发中,有些时候涉及到将程序的状态保存下来,以便下一次恢复,或者是记录用户的一些喜好和用户的登录信息等等。 这就需要涉及到数据的持久化了,所谓数据持久化就是数据的本地保存,将数据从内存中迁入到存储器上。网上有很多种数据持久化的方法,如实现自己实现I/O、数据库、云或则走第三方接口等等。但是有时候可能只是进行一些简单的数据存储,如用户的偏好设置、用户的sessionID等等,这时候使用上述方法便显得有点兴师动众了,现在需要一种更加轻量化的操作方式。
一、认识 NSUserDefaults
为了寻求上述问题的解决方案,查阅apple官方文档发现,有一个类NSUserDefaults是苹果设计专门用来解决这个问题的:
NSUserDefaults is a hierarchical persistent interprocess (optionally distributed) key-value store, optimized for storing user settings.
翻译大致如下:
NSUserDefaults 是一种进程间(任意分布)的分层级持久化键-值存储,为存储用户设置而优化。
详细说明可以查阅官方文档,这里只介绍其使用。
现在,我们已经找到了一种轻量级的数据持久化解决方案了,为什么说它轻量级呢。因为apple官方设计它的目的就是为了解决用户设置的存储问题,下面就来介绍它的使用。
二、使用 NSUserDefaults
由于NSUserDefaults是一种进程间的解决方案,所以我们可以在任意一个进程中调用它来访问和存储用户的信息。
举个例子:我们要对用户的用户名进行数据的持久化操作
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"whf" forKey:@"name"];
通过上面这两行代码,我们就已经将用户的姓名通过键值对的方式存储到本地了。不需要指定数据的存储位置,一切由系统搞定,我们只需要告诉系统我们要存什么。如果多次存储的是同一个键的值,那么这个键的值是根据最后一次的值定的,也就是说系统是覆盖写,而不是追加写最后返回的是数组。
接下来演示取数据的过程:在任意线程中,我们调用
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSString *userName = [userDefaults objectForKey:@"name"];
这两句就可以从存储器上获得我们要的数据了,如果数据不存在,那么返回的对象就是nil。
三、底层实现机制
通过NSUserDefaults的使用,发现程序重新运行数据依旧存在,那么这个数据肯定是被存储在了手机的存储器上。现在来探寻它的实现机制:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@"123" forKey:@"name"]; NSString *userName = [userDefaults objectForKey:@"name"]; NSLog(@"%@",userName); NSString *homeDirectory = NSHomeDirectory(); NSLog(@"homeDire --------%@",homeDirectory);
运行结果:

根据路径进入沙盒发现,在沙盒的Library/Preferences/目录下发现多出了一个com.itripbuyer.Date-Persistence.plist的plist文件。

打开后发现里面有一个键值对,并且就是我们刚刚操作的数据。于是我猜测,通过我们刚才的两行代码,系统将我们的数据转换成了一个plist文件,这个文件中装载的是一些键值对。
四、灵活巧用
NSUserDefaults 官方给出的用途是存储用户的Setting,但是通过上述操作发现,程序中凡是涉及到键值对的存储,都可以使用NSUserDefaults来实现,即使不是键值对的形式,转换成键值对也要用NSUserDefaults来实现,这样既省时又省力,还能用最简洁的代码换来最稳定的数据持久化操作。
以上就是iOS用两行代码完美解决数据持久化的全部内容,希望本文对大家开发IOS的时候有所帮助。
本文向大家介绍Java语言求解完美数代码分析,包括了Java语言求解完美数代码分析的使用技巧和注意事项,需要的朋友参考一下 1、概念 首先我们理解一下,什么叫做完美数? 问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数。简称“完数” 例如, 6=1+2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+2
除了第 3 章的 Express 的介绍以及后面第 10 章的安全之外,本章也是全书我最喜欢的章节了。 毫无疑问,几乎所有的应用都会涉及到数据存储。但是 Express 框架本身只能通过程序变量来保存数据,它并不提供数据持久化功能。而仅仅通过内存来保存数据是无法应对真实场景的。因为内存本身并不适用于大规模的数据储存而且服务停止后这些数据也会消失。另外,使用内存中的数据是无法跨机器共享的。虽然我们还
本文向大家介绍iscroll动态加载数据完美解决方法,包括了iscroll动态加载数据完美解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了iscroll动态加载数据的具体代码,供大家参考,具体内容如下 js. css 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍两行IOS代码实现轮播图,包括了两行IOS代码实现轮播图的使用技巧和注意事项,需要的朋友参考一下 此篇文章讲述IOS轮播图,仅需要几步就可以完成,很简单了。 第一步:利用cocopods导入KJBannerView组件 第二步:在m文件加入代理 第三步:实现就仅此一步 实现 实现轮播图只要上面这步骤就可以了 此处用的是本地图片,因此需要自己导入相关图片,到项目工程里面 亲测可行,放心
本文向大家介绍mysql8.0.19忘记密码的完美解决方法,包括了mysql8.0.19忘记密码的完美解决方法的使用技巧和注意事项,需要的朋友参考一下 推荐阅读:MySQL 8.0.19支持输入3次错误密码锁定账户功能(例子) 1.打开cmd窗口(最好以管理员身份打开),net stop mysql 停止mysql服务 2.开启跳过验证密码的mysql服务 mysqld --console --
我正在使用网络逻辑10.3。我正在尝试配置一个持久订阅,其中包含由 jdbc 存储(在 Oracle DB 中)支持的持久消息。我有一个主题,MDB 正在作为持久订阅者侦听该主题。在场景-1下:如果我发送消息,它会命中MDB。 在场景2中:我挂起了MDB,希望发送到主题的消息只要不被MDB(它是唯一注册的持久订阅者)使用,就会一直存在。但是当我向主题发送消息时,它短暂地出现在那里,然后就消失了(我
本文向大家介绍redis数据的两种持久化方式对比,包括了redis数据的两种持久化方式对比的使用技巧和注意事项,需要的朋友参考一下 一.概念介绍 redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Apend Only File)。 RDB方式 RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中。 •redis在进行数据持久化的过程中,会先将数据
主要内容:一、数据持久化,二、持久化的形式,三、源码分析,四、总结一、数据持久化 redis做为一种内存型数据库,做持久化,个人感觉略有鸡肋的意思。似乎有一种,别人有,自己不有也不行的感觉。以目前Redis主流的应用方式,如果仔细分析,基本上都是在内存中即可完成,对持久化没要求或者说不大。再举一个反例,如果内存中有几百G甚至更多的数据,真要是整体当机,恢复的时间基本就是灾难。 目前基本应用仍然是以关系型数据库或者其它数据库(如Hadoop,Mysql等)为持久化