在实际的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 = www.90168.org[NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"123" forKey:@"name"];
NSString *userName = [userDefaults objectForKey:@"name"]; NSLog(@"%@",userName);
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"homeDire --------%@",homeDirectory);

运行结果:


Snip20160807_8.png

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


Snip20160807_9.png

打开后发现里面有一个键值对,并且就是我们刚刚操作的数据。于是我猜测,通过我们刚才的两行代码,系统将我们的数据转换成了一个plist文件,这个文件中装载的是一些键值对。

四、灵活巧用

NSUserDefaults 官方给出的用途是存储用户的Setting,但是通过上述操作发现,程序中凡是涉及到键值对的存储,都可以使用NSUserDefaults来实现,即使不是键值对的形式,转换成键值对也要用NSUserDefaults来实现,这样既省时又省力,还能用最简洁的代码换来最稳定的数据持久化操作。

iOS 两行代码解决数据持久化的更多相关文章

  1. iOS中几种数据持久化方案

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  2. iOS中几种数据持久化方案:我要永远地记住你!

    http://www.cocoachina.com/ios/20150720/12610.html 作者:@翁呀伟呀 授权本站转载 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启 ...

  3. ios学习笔记-数据持久化

    沙盒 沙盒是一种数据安全策略,只允许自己的应用访问目录.可以使用NSHomeDirectory()获取. ios沙盒下有三个子目录: 1.Documents目录:用于存储比较大的文件活着需要频发女更新 ...

  4. iOS开发 - CoreData框架 数据持久化

    Core Data Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还 ...

  5. node - 处理跨域 ( 两行代码解决 )

    1,安装 cors 模块 : npm install cors 2,代码 : var express = require('express') var app = express() var cors ...

  6. 学生信息系统(json模块解决数据持久化)

    将学生管理的案例,学生信息由原来的只有姓名,拓展为包含,姓名,年龄,两个属性:完成对应的增.删.查.改,操作 import json,os,time,sys student_list = [] Fil ...

  7. Linux排序不准确的问题,用以下两行代码解决

    export LC_ALL=C                                                                                      ...

  8. iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)

    本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...

  9. iOS数据持久化

    在iOS中,实现数据持久化一般分为4大种: 1.属性列表 2.对象归档 3.SQLite 4.Core Data 一.属性列表 NSUserDefaults类的使用和NSKeyedArchiver有很 ...

随机推荐

  1. BZOJ4416: [Shoi2013]阶乘字符串

    可以大胆猜想n>21时无解,至于依据,不开O2,1s,n<=21刚好能卡过去= = 并不会证= = #include<cstdio> void up(int& a,in ...

  2. C#之方法的声明与调用

    //params关键字使用 class Program { static void Main(string[] args){ , , , }; Console.WriteLine(AddFunctio ...

  3. js轮播(qq幻灯片效果)

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...

  4. Redis中持久化的两种方法详解

    Redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里;另一种方法教只追加文件(append-only f ...

  5. 记录-div绝对定位针对手机浏览器的区别

    最近搞个wap ,有一个需求就是一些文字描述定位到一张图片上的某个地方,按照以往的方式直接通过定位div position: absolute; PC chrome 模拟手机显示没问题! 但是,在ip ...

  6. SQL Server附加数据库时报1813错误的解决方案

    SQL Server附加数据库时报1813错误的解决方案   无法打开新数据库 'ASR'.CREATE DATABASE 中止. 文件激活失败.物理文件名称'E:\SqlServer\MSSQL\D ...

  7. double 和 float

    对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位.但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言 ...

  8. 如何用angularjs给从后台传来数据添加链接

    <!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="UTF- ...

  9. Html 两个DIV并排的问题

    在一个容器内部,要放在两个并排的DIV,两个方法: 1.使用浮动.这个方式div是脱离文档流的,在窗口布局复杂,大小变化的时候,可能会有一些不希望的情况发生. <!DOCTYPE HTML> ...

  10. 用DateTime的ParseExact方法解析特殊的日期时间

    今天遇到一个特别的需求,需要从下面的字符串中转换成一个DateTime对象: [07-13 15:50:42] 主要问题是这个时间不是标准的时间,而是自定义的格式,即开头是月-日,然后是时间. 使用最 ...