iOS数据持久化之二——归档与设计可存储化的数据模型基类(一)

简介: iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二——归档与设计可存储化的数据模型基类


一、引言


       在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法。虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性。试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型。


二、先来精通归档吧


       归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取。其存储与读取的过程,主要封装在两个类中:NSKeyedArchiver和NSKeyedUnarchiver。


1、归档的原理


       归档是将一种或者多种数据类型进行序列化,解归档的过程就是将序列化的数据进行反序列化的解码,这里需要注意一点,归档的核心并非是数据的持久化处理,而是数据的序列化处理,持久化的处理依然是通过文件存取来实现的。因此,被归档的数据类型都必须遵守一个相同的协议,才能在这个协议的约束下进行正确的归档与解归档,这个协议就是NSCoding协议,我们可以先来看一下NSCoding中的内容:


@protocol NSCoding


- (void)encodeWithCoder:(NSCoder *)aCoder;

- (id)initWithCoder:(NSCoder *)aDecoder;


@end


这个协议非常简单,一个init的归档方法,一个encode的解归档方法,NSCoder就是归档对象。原则上说,无论是什么数据类型的对象,系统的或者是我们自定义的,都可以通过实现这个协议中的方法来支持归档操作。


2、几种归档与解归档的应用


(1)通过类方法来对rootKey进行归档


       这种方式,我个人理解,很类似于NSUserDefaults中的standardUserDefaults,只是后者是系统为我们创建的一个默认plist文件,而rootKey是系统为我们创建的一个默认的归档键值。说起来比较复杂,举个例子就十分清晰了:


   NSString *homeDictionary = NSHomeDirectory();//获取根目录

   NSString *homePath  = [homeDictionary stringByAppendingPathComponent:@"atany.archiver"];//添加储存的文件名

   //方式一:通过data数据归档,在将数据写入文件

   NSData *data= [NSKeyedArchiver archivedDataWithRootObject:@"123"];

   [data writeToFile:homePath atomically:YES];

   //方式二:直接写入文件

   [NSKeyedArchiver archiveRootObject:@"456" toFile:homePath];

   //方式一和方式二的效果完全一样 只是解归档的时候不同

 

   //方式一的解归档:先获取data数据,在进行data数据的解归档

   NSLog(@"%@",[NSKeyedUnarchiver unarchiveObjectWithData:data]);

   //方式二的解归档:直接解文件中的归档

   NSLog(@"%@",[NSKeyedUnarchiver unarchiveObjectWithFile:homePath]);


上面的示例是对字符串类型进行的归档,是对单一的数据对象进行的归档,当然,这里的对象是支持数组、字典等集合的,但集合其中的对象,也必须全部支持归档操作。


(2)通过构造新的archiver对象,对多个对象进行归档


       除了上面的类方法,我们还可以自己构造一个归档对象,来对多种不同的对象进行归档:


   NSString *homeDictionary = NSHomeDirectory();//获取根目录

   NSString *homePath  = [homeDictionary stringByAppendingPathComponent:@"atany.archiver"];//添加储存的文件名

   //这里创建一个可变的data对象作为归档的容器

   NSMutableData * data = [[NSMutableData alloc]init];

   //创建一个归档对象,归档后写入data数据

   NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

   //对下面的字符串和int值进行归档序列化

   [archiver encodeObject:@"jaki" forKey:@"name"];

   [archiver encodeInt:24 forKey:@"age"];

   //写入data

   [archiver finishEncoding];

   //写入文件

   [data writeToFile:homePath atomically:YES];

 

   //创建解归档的反序列化对象

   NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

   //进行反序列化

   NSString * name = [unarchiver decodeObjectForKey:@"name"];

   int age = [unarchiver decodeIntForKey:@"age"];

   //打印信息

   NSLog(@"\nname:%@\nage:%d",name,age);


结果如下:

image.png

目录
相关文章
|
6月前
|
JSON JavaScript 安全
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
60 1
|
6月前
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
102 0
|
3月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
|
6月前
|
Java iOS开发
iOS的数据序列化(又称持久化)的两类使用方式
iOS的数据序列化(又称持久化)的两类使用方式
66 0
|
6月前
|
移动开发 小程序 API
uniapp通过蓝牙传输数据 (ios)
uniapp通过蓝牙传输数据 (ios)
320 1
|
6月前
|
JSON JavaScript 安全
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
|
6月前
|
Web App开发 网络安全 Android开发
🚀2023最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包
在移动应用程序的开发中,了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法,可以让我们分析应用程序的网络请求和响应,了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具,可以帮助我们在 Android 和 iOS 平台上进行数据抓包。本篇博客将介绍如何使用克魔助手在 iOS 平台上进行数据抓包。
|
6月前
|
存储 移动开发 JavaScript
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
|
6月前
|
Java 开发工具 Android开发
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践
本文介绍了使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践。
443 7
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践