iOS 数据持久化之NSUserDefaults-保存Settings

原创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信息包括四个步骤

  1. 创建一个plist来保存默认设置
  2. 在AppDelegate 的方法中注册默认的设置
  3. 适当的时候,读出设置信息
  4. 用户保存了设置信息,写入到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的博客都要详细吧?

你可能感兴趣的:(数据持久化+CoreData,iOS开发详解)