NSURLSession
1 URL
2 单例session
3 session发起任务
4 启动任务
5 处理响应
// 1.URL
NSURL *URL = [NSURL URLWithString:@"http://www.baidu.com"];
// 2.获取单例session
NSURLSession *session = [NSURLSession sharedSession];
// 3.session发起任务 以下是参数解释
/*
参数1 : JSON数据的二进制
参数2 : 可选项 (位移枚举)
NSJSONReadingMutableContainers = (1UL << 0), 1向左移0位 == 1
JSON解析之后,容器可变;result就是容器,解析之后的结果是否是可变数组/字典
实际开发中,不用;因为json反序列化之后,需要字典转模型;字典转模型对容器是否可变没有任何的影响
NSJSONReadingMutableLeaves = (1UL << 1), 1向左移1位 == 10 ==> 2
JSON解析之后,叶子(容器元素)可变;iOS7.0以后就失效了
NSJSONReadingAllowFragments = (1UL << 2) 1向左移2位 == 100 ==> 4
是否允许解析不是标准json格式的数据;开发中,如果json数据格式不标准;说明数据有错,后台需要调整数据;
参数3 : 错误信息
*/
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:URL
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// completionHandler : 默认在子线程
NSLog(@"%@",[NSThread currentThread]);
// data : 响应体; response : 响应头; error : 错误信息
// 5.处理响应
if (error == nil) {
// 6.反序列化,并刷新UI
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.webView loadHTMLString:html baseURL:URL];
}];
} else {
NSLog(@"%@",error);
}
}];
// 4.启动任务,任务默认挂起的,需要启动
[dataTask resume];
如果需要解析的URL是JSON数据
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 5.处理响应
if (error == nil) {
// data : 保存的是json数据的二进制
// 6.反序列化 : 把二进制数据转成OC对象
// NSJSONSerialization 会根据json的顶级节点自动判断反序列化之后,转成字典还是数组
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
//或者用id result = [[JSONDecoder decoder] objectWithData:data];
//但是 是mrc的并且是第三方的 如果在公司发现 建议直接替换成上面官方的
NSLog(@"%@ -- %@",[result class],result);
} else {
NSLog(@"%@",error);
}
}];
Plist解析的核心代码
以下写法是 : NSURLSession发起任务和启动任务的简写
- (void)loadPlist
{
// 1.URL
NSURL *URL = [NSURL URLWithString:@"http://localhost/videos.plist"];
// 2.NSURLSession发起任务和启动任务的简写
[[[NSURLSession sharedSession] dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 3.错误处理
if (error == nil && data != nil) {
// 4.反序列化
id result = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];
NSLog(@"%@ -- %@",[result class],result);
} else {
NSLog(@"%@",error);
}
}] resume];
}
Plist解析时的参数说明
/*
参数
1. data: 要反序列化的二进制数据
2. option: 选项,位移枚举类型
NSPropertyListImmutable = 0, 不可变
NSPropertyListMutableContainers = 1, 容器可变
NSPropertyListMutableContainersAndLeaves = 2 容器和叶子可变
3. format: 如果不希望知道格式,传入 NULL 即可
4. error: 错误
*/
id result = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];
JSON语法
// 使用JSON描述一个人 : JSON具有自我描述性
{
"name" : "李狮",
"age" : 18
}
// 描述班级
[
{
"name" : "刘佳",
"sex" : 0
},
{
"name" : "杨婷",
"sex" : 1
}
]
反序列化
把二进制数据转成OC对象
NSJSONSerialization 会根据json的顶级节点自动判断反序列化之后,转成字典还是数组
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
如果接受的数据是字典就将类型id改成字典接 如果是数组就用数组接
参数信息
参数1 : JSON数据的二进制
参数2 : 可选项 (位移枚举)
NSJSONReadingMutableContainers = (1UL << 0), 1向左移0位 == 1
JSON解析之后,容器可变;result就是容器,解析之后的结果是否是可变数组/字典
实际开发中,不用;因为json反序列化之后,需要字典转模型;字典转模型对容器是否可变没有任何的影响
NSJSONReadingMutableLeaves = (1UL << 1), 1向左移1位 == 10 ==> 2
JSON解析之后,叶子(容器元素)可变;iOS7.0以后就失效了
NSJSONReadingAllowFragments = (1UL << 2) 1向左移2位 == 100 ==> 4
是否允许解析不是标准json格式的数据;开发中,如果json数据格式不标准;说明数据有错,后台需要调整数据;
参数3 : 错误信息
另一种方式反序列化
用JSONKit进行反序列化
id result = [[JSONDecoder decoder] objectWithData:data];
从网络加载plist
使用NSURLSession获取plist文件的二进制,使用NSPropertyListSerialization反序列化
- (void)loadPlistData
{
// 1.URL
NSURL *URL = [NSURL URLWithString:@"http://localhost/videos.plist"];
// 2.获取单例session
NSURLSession *session = [NSURLSession sharedSession];
// 3.session发起任务
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 5.处理响应
if (error == nil && data != nil) {
// 6.反序列化
id result = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];
NSLog(@"%@-%@",[result class],result);
} else {
NSLog(@"%@",error);
}
}];
// 4.启动任务
[dataTask resume];
}