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>@interface Book : 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
|
@implementation Book- (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"]; return self; }@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=[[NSNumber alloc] initWithInteger:45]; if ([NSKeyedArchiver archiveRootObject:book toFile:_storagePath]) { NSLog(@"数据存档成功"); } |
单个解压:
|
1
2
3
4
5
|
Book *decodeBook=[NSKeyedUnarchiver unarchiveObjectWithFile:_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=[NSMutableArray array]; for (NSInteger i=1; i<3; i++) { Book *book=[[Book alloc]init]; NSString *imageName=[NSString stringWithFormat:@"Code%ld.jpg",(long)i]; UIImage *image=[UIImage imageNamed:imageName]; book.ConverPicture=image; book.BookName=[NSString stringWithFormat:@"百年孤独%ld",(long)i]; book.Author=[NSString stringWithFormat:@"加西亚.马尔克斯%ld",(long)i]; book.Price=[[NSNumber alloc] initWithInteger:45]; [self.bookList addObject:book]; } if ([NSKeyedArchiver archiveRootObject:self.bookList toFile:_storageListPath]) { NSLog(@"数据存档成功"); } |
多个解档:
|
1
2
3
4
|
self.bookList=[NSKeyedUnarchiver unarchiveObjectWithFile:_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 ...
随机推荐
- hbase深入了解
http://blog.csdn.net/u010967382/article/details/37878701?utm_source=tuicool&utm_medium=referral ...
- [转]oracle awr报告生成和分析
转自:http://blog.csdn.net/cuker919/article/details/8767328 最近由于数据库cpu占用非常高,导致VCS常常自动切换,引起很多问题. 最近学习一下数 ...
- 【中文分词】DAG、DP、HMM、Viterbi
http://blog.sina.com.cn/s/blog_8267db980102wq41.html http://www.cnblogs.com/leeshine/p/5804679.html ...
- easyui combobox简单用法
<script type="text/javascript">var order_pay_type;$(function() { $("#order_pay_ ...
- 利用ROS工具从bag文件中提取图片
bag文件是ROS常用的数据存储格式,因此要从bag文件中提取数据就需要了解一点ROS的背景知识. 1. 什么是ROS及其优势 ROS全称Robot Operating System,是BSD-lic ...
- javascript的特殊条件语句
摘要: 由于javascript语言的特殊性导致它有很多特殊的条件判断,下面我列出了一些特殊的条件判断语句和他们对应的结果. if(condition) { console.log(true); ...
- 分享一个有趣的代码,调用电脑中的api语音
在文本文件中输入如下代码: set objTTS = CreateObject("sapi.spvoice") objTTS.speak("为啥我对象这么闹呢?" ...
- PHP 免费获取手机号码归属地
一.淘宝网API API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 参数: tel:手机号码 返回 ...
- 5 -- Hibernate的基本用法 --4 3 JDBC连接属性
Hibernate需要进行数据库访问,因此必须设置连接数据库的相关属性.所有Hibernate属性的名字和语义都在org.hibernate.cfg.Environment中定义. 关于JDBC连接配 ...
- Cocos2dx3.0 TextField 输入中文的问题
一开始无法输入中文, 显示出来的是乱码, 修改一个函数, 下面是修改过后的代码 void GLView::onGLFWCharCallback(GLFWwindow *window, unsigned ...