iOS开发-数据存储NSCoder
软件中永远绕不开的一个问题就是数据存储的问题,PC的时候一般都是选择在数据库中存储,iOS如果是和后端配合的话,那么不需要考虑数据存储的这个问题,上次写了一下plist的存储,不过数据都是存储一些简单的键值对对象。本次需要将一些自己定义的类型存储在plist比如说图片,这个时候可以利用NSCoding协议,将数据地以类似档案的形式存储到plist文件中,然后从plist的文件中读取数据,使用协议的时候这个时候就会用到了NSCoder,如果对存档和解压没有概念的话,可以简单的理解为数据的序列化与反序列化。
基础概念
NSCoding是一个protocol. 如果实现了NSCoding,需要实现其中的两个方法:
| 1 2 | - (void)encodeWithCoder:(NSCoder*)aCoder;- (id)initWithCoder:(NSCoder*)aDecoder; // NS_DESIGNATED_INITIALIZER | 
方法中的主要的参数就是NSCoder,它是archivie字节流的抽象类.可以将数据写入一个coder,也可以从coder中读取我们写入的数据. NSCoder是一个抽象类,不能直接使用它来创建对象. 但是可以通过其子类NSKeyedUnarchiver从字节流中读取数据,NSKeyedArchiver将对象写入到字节流。本文以书籍为例:
新建一个Book类,Book.h中的代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interfaceBook : NSObject<NSCoding>@property(strong,nonatomic) UIImage *ConverPicture;@property(strong,nonatomic) NSString*BookName;@property(strong,nonatomic) NSString*Author;@property(strong,nonatomic) NSNumber*Price;@end | 
Book.m中实现NSCoding的两个方法,注意中UIImage的写法与其他有所不同:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @implementationBook- (void)encodeWithCoder:(NSCoder*)aCoder{        //注意这里是存储的是JPG图片的调用    [aCoder encodeObject:UIImageJPEGRepresentation(self.ConverPicture,1.0)forKey:@"ConverPicture"];    [aCoder encodeObject:_BookName forKey:@"BookName"];    [aCoder encodeObject:_Author forKey:@"Author"];    [aCoder encodeObject:_Price forKey:@"Price"];    }- (id)initWithCoder:(NSCoder*)aDecoder{        self.ConverPicture=[UIImage imageWithData:[aDecoder decodeObjectForKey:@"ConverPicture"]];    self.BookName=[aDecoder decodeObjectForKey:@"BookName"];    self.Author=[aDecoder decodeObjectForKey:@"Author"];    self.Price=[aDecoder decodeObjectForKey:@"Price"];    returnself;    }@end | 
Demo实现
正常的情况的不需要新建页面的,不过需要演示一下UIImage的效果,Main.storyboard中的布局:

稍微解释一下,前两个是存的单文件,后两个存的是多文件,UIImage展示存储的图片:
ViewController定义字段:
| 1 2 3 4 5 | @property(strong,nonatomic) NSString*storagePath;@property(strong,nonatomic) NSString*storageListPath;@property(strong,nonatomic) NSMutableArray*bookList; | 
设置路径,如果不是很清晰,可参考本文之前的博客:
| 1 2 3 4 | NSArray*codepath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  _storagePath = [codepath[0] stringByAppendingPathComponent:@"book.plist"];      NSLog(@"%@",NSHomeDirectory());  _storageListPath = [codepath[0] stringByAppendingPathComponent:@"booklist.plist"]; | 
单个存档:
| 1 2 3 4 5 6 7 8 9 | Book *book=[[Book alloc]init];   UIImage *image=[UIImage imageNamed:@"Code1.jpg"];   book.ConverPicture=image;   book.BookName=@"百年孤独";   book.Author=@"加西亚.马尔克斯";   book.Price=[[NSNumberalloc] initWithInteger:45];   if([NSKeyedArchiverarchiveRootObject:book toFile:_storagePath]) {       NSLog(@"数据存档成功");   } | 
单个解压:
| 1 2 3 4 5 | Book *decodeBook=[NSKeyedUnarchiverunarchiveObjectWithFile:_storagePath];  self.myImageView.image=decodeBook.ConverPicture;     NSLog(@"%@",decodeBook.ConverPicture);  NSLog(@"%@",decodeBook.BookName);  NSLog(@"解档成功"); | 
多个存档:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | self.bookList=[NSMutableArrayarray];  for(NSIntegeri=1; i<3; i++) {      Book *book=[[Book alloc]init];      NSString*imageName=[NSStringstringWithFormat:@"Code%ld.jpg",(long)i];      UIImage *image=[UIImage imageNamed:imageName];      book.ConverPicture=image;      book.BookName=[NSStringstringWithFormat:@"百年孤独%ld",(long)i];      book.Author=[NSStringstringWithFormat:@"加西亚.马尔克斯%ld",(long)i];      book.Price=[[NSNumberalloc] initWithInteger:45];      [self.bookList addObject:book];    }  if([NSKeyedArchiverarchiveRootObject:self.bookList toFile:_storageListPath]) {      NSLog(@"数据存档成功");  } | 
多个解档:
| 1 2 3 4 | self.bookList=[NSKeyedUnarchiverunarchiveObjectWithFile:_storageListPath];Book *nextBook=self.bookList[1];self.myImageView.image=nextBook.ConverPicture;NSLog(@"解档成功"); | 
通过代码基本上发现其实存档和解压是非常简单的一个事情,不过事实这种方式缺点还是很明显的,以这种方式保存数据只能一次性归档保存以及一次性解压。数据较少的时候如果使用感觉比较方便,数据量过多的时候如果想修改其中的某一条,解压整个数据然后归档整个数据还是比较耗时的。最终演示效果如下:

出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
iOS开发-数据存储NSCoder的更多相关文章
- IOS开发数据存储篇—IOS中的几种数据存储方式
		IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ... 
- iOS开发UI篇—ios应用数据存储方式(归档)
		iOS开发UI篇—ios应用数据存储方式(归档) 一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同 ... 
- iOS开发UI篇—ios应用数据存储方式(归档) :转发
		本文转发至:文顶顶http://www.cnblogs.com/wendingding/p/3775293.html iOS开发UI篇—ios应用数据存储方式(归档) 一.简单说明 在使用plist ... 
- iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
		iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ... 
- iOS开发UI篇—ios应用数据存储方式(偏好设置)
		iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ... 
- iOS开发技术分享(1)— iOS本地数据存储
		iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ... 
- iOS本地数据存储(转载)
		看到一篇不错的文章,推荐给大家!!! 应用沙盒 1)每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 2)应用沙盒的文 ... 
- iOS应用数据存储的常用方式
		iOS应用 数据存储的常用方式 XML属性列表 plist Preference 偏好设置 NSKeyedArchiver 归档 Core Data SQLite3 应用沙盒: Layer: ... 
- iOS开发 数据缓存-数据库
		iOS中数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding (NSKeyedArchiver\NSk ... 
随机推荐
- VVDocumenter规范注释生成器
			下载地址:https://github.com/onevcat/VVDocumenter-Xcode PS:Xcode 8.0 默认支持了,但是是关闭状态,需要在终端输入如下命令开启,然后重启 Xco ... 
- rdlc报表 矩阵控件下的按组分页
			场景: 使用rdlc开发报表,例如订单产品报表,显示多个订单,一个订单有动态生成的固定的多个产品组成,同时统计每个订单里多个产品数量总数. 数据库层面分析: 此报表属于交叉报表,例如5个订单,3个产品 ... 
- 双向认证SSL原理
			http://m.blog.chinaunix.net/uid-540802-id-3170984.html 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的 ... 
- ubuntu14.04 允许root用ssh登录
			重启ssh service ssh restart 查看ssh是否已安装 ssh进程 ps -e | grep ssh ssh占用端口 lsof -i:22 ssh服务已启动,但是用root账号无法连 ... 
- 未定义变量 "caffe" 或类 "caffe.reset_all"
			配置caffe后在matlab中测试报错. 未定义变量 "caffe" 或类 "caffe.reset_all". 我的原因是:caffe在matlab接口处没 ... 
- 【乐呵一下】WINDOWS有个非常低级的错误!
			该错误来自微软windows附带的计算器(开始附件计算器). 1. 当你尝试用9216除以96并按下=按钮时,计算器竟然没有反应!!! 而9216除以97,98却正常. 2. 还有一个错误,当你尝试用 ... 
- mysql中json_object函数的使用?
			需求说明: 今天看了json_object函数的使用,在此记录下使用过程 操作过程: 1.使用json_object函数将一个键值对列表转换成json对象 mysql> select json_ ... 
- [scala] scala 函数 (⑦)
			1.scala 函数定义 2.scala 高阶函数 3.匿名函数 4.柯里化 import scala.math._ /** * @author xwolf * @date 2017-04-24 9: ... 
- Apache中的Order Allow,Deny用法详解
			本文讲述了Apache中的Order Allow,Deny用法.分享给大家供大家参考,具体如下: Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directo ... 
- Linux+Redis实战教程_day02_2、redis简述及安装与启动
			2. redis简述及安装 关系型数据库(SQL): Mysql,oracle 特点:数据和数据之间,表和字段之间,表和表之间是存在关系的 例如:部门表 001部门, 员工表 001 用户表,用户 ... 
