原创Blog,转载请注明
blog.csdn.net/hello_hwc
前言:iOS的数据持久化存储分为很多种
- 普通文件,plist
- NSUserDefaults
- CoreData
- KeyChain
本文讲解NSUserDefaults的使用
什么样的数据存储在NSUserDefaults里?
用户的偏好信息,设置信息等。换句话说,app的Setting里的信息,都可以存储在这里。
不能用来存储大量数据。
保存的文件存储在哪里?
文件存储在
这里的
HOME是app的沙盒Data目录
$HOME/Library/Preferences/
这个目录下会保存一个.plist来存储数据。
这里的数据是未没有加密的,不要用它保存用户名密码
StandardUserDefaults
大部分的时候使用StandardUserDefaults来保存settings数据,这是一个共享的UserDefaults,意味着在程序的任意一个地方访问到的都是同一个UserDefaults
为一个App添加Settings信息包括四个步骤
- 创建一个plist来保存默认设置
- 在AppDelegate 的方法中注册默认的设置
- 适当的时候,读出设置信息
- 用户保存了设置信息,写入到NSUserDefaults中
创建Plist
注册默认的设置
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSUserDefaults * standard = [NSUserDefaults standardUserDefaults];
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"DefaultSettings" withExtension:@"plist"];
NSDictionary * defaultSettings = [NSDictionary dictionaryWithContentsOfURL:fileURL];
[standard registerDefaults:defaultSettings];
return YES;
}
注意,创建的设置信息是在Registration Domain中。这个域是一个临时域,在初始化NSUserDefautls的时候,会先搜索Application Domain(正常读取的数据),再搜索Registration Domain。使用这个域是为了在Application Domain中没有存储数据的时候(例如第一次)也能够正常读取数据。
读出设置信息
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
NSInteger savedbool = [settings boolForKey:@"KEYBOOL"];
NSString * savedStr = [settings stringForKey:@"KSTRING"];
保存设置信息
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
[settings setBool:false forKey:@"KEYBOOL"];
[settings setObject:@"String" forKey:@"KSTRING"];
注意,上面的代码写入的数据,并不会立刻同步到文件里,而是保存在cache中,这样做提升速率(文件IO的效率很低)。IOS系统每隔一段时间会同步一次。如果要立刻同步
[settings synchronize];
如果不是非常有必要同步到数据库里,建议不要每次写入都调用同步方法,因为相对来说,它实在是很慢。
为app group服务的UserDefaults
这样的UserDefaults是共享的,在以下两种情况下使用
- app suite,也就是说两个app之间需要共享数据
- app extension,在extension和他的contain app之间共享数据。典型的是输入法程序,在contain app里设置以后,键盘的样式就会改变。
如何使用-以extension为例
在contain app写入数据
OC代码
NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.yourappname"];
[shared setObject:your dic forKey:@"KDICFORWIDGET"];
[shared setObject:@"1234" forKey:@"KSTRINGFORWIDGET"];
[shared synchronize];
在extension读数据
NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.yourappname"];
NSMutableDictionary *dic = [shared objectForKey:@"KDICFORWIDGET"];
NSString *str = [shared objectForKey:@"KSTRINGFORWIDGET"]
BTY,我想知道,点踩点那位同学,你是觉得我写的哪里不对吗?我感觉我写的比国内95%关于NSUserDefaults的博客都要详细吧?