这是我参与「第四届青训营 」笔记创作活动的的第15天
iOS 网络与存储编程原理| 青训营笔记
iOS存储
存储的本质:将信息以二进制形式保存在计算机内存/硬盘中
基本数据类型如数字、字符都有对应的编码形式,那么面向对象中对象都是如何转化为二进制的呢? 因此我们首先来了解一下对象的序列化与反序列化
序列化与反序列化
- 序列化:将对象转换为字节序列的过程称为对象的序列化
- 反序列化:将字节序列恢复为对象的过程称为对象的反序列化
常见序列化协议
- JSON:最常用的序列化协议,在浏览器时代B/S架构下,解决了不同网站服务器和客户端浏览器的数据交互问题
- 可读性强
- 文件大小较小,传输速度快
- XML:浏览器最初使用的格式,但数据冗余较多
- 可读性中等
- 文件相对较大,传输速度相对慢
- protobuf:谷歌的数据交换协议
- 不可读(二进制文件)
- 文件小,传输速度很很快
- 可用于RPC
iOS序列化与反序列化方法
序列化JSON
// 序列化
[NSJSONSerialization (nullable NSData *)dataWithJSONObject: (id)obj options: (NSJSONWritingOptions)opt error: (NSError **)error];
// 反序列化
[NSJSONSerialization (nullable id) JSONObjectWithData: (NSData *)data options: (NSJSONReadingOptions)opt error: (NSError **)error];
序列化对象
通过在类中实现NSCoding协议中方法即可定义对象的序列化
@implementation DemoClass
(instancetype)initWithCoder:(NSCoder *)coder {
self = [super init]:
self.age = [coder decodeIntegerForKey: @"age"]:
self.name = [coder decodeObjectForKey:@"name"];
return self;
7
(void)encodeWithCoder:(NSCoder *)coder {
[coder encodeInteger:self.age forKey:@"age"];
[coder encodeObiect:self.name forKey:@"name"]:
}
但自己写每个类的序列化比较枯燥麻烦,因此也有很多现成的库可以使用,如
- JSONModel
- YYModel
- Mantie
存储的作用:是为了保存更多的数据交互以提供更加丰富的功能
下面首先了解一下存储数据的方式
内存
在没有学习网络和存储编程之前,之前代码中所有的数据都是在程序运行中创建并保存在内存上的,如果程序结束,数据将不复存在,不具有持久性,因而功能就相对受限
文件
通过编码将数据保存到硬盘中,实现数据持久化。通过网络请求数据,本质也是文件,只不过是存储在服务器上的数据,通过网络发送到本地。
iOS网络
这里仅简单给出iOS网络请求常用类和相应的API,不对网络相关知识进行展开
NSURL:url对象
提供各种url中的参数,无需手动解析,如baseUrl,host,post,path等
NSURLRequest(NSMutableURLRequest):发送请求
(void)sendRequest {
//初始化请求
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:@"请求地址"];
//设置请求方法
request.HTTPMethod = @"POST";
//设置请求头
[request addValue:@"application/json"forHTTPHeaderField:@"Content-Type"]:
[request addValue:@"application/json"forHTTPHeaderField:@"Accept"]:
//设置请求体,在此进行序列化
request.HTTPBody = [self.todoList yy_modelToJSONData];
//设置请求返回后的操作
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler: ^ (NSData * _Nullable data, NSURLResponse
response, NSError * _Nullable error) {
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
//进行操作});
}] resume];//发送请求