通知,JSONMOdel,kvo,kvc,网络,xml
2016-12-18 16:12
211 查看
大多数APP都是依托于服务器的,由服务器负责数据的管理交互,分发,筛选等等。APP做的事情就是发送请求,接收数据。当然有些请求也可以伴随数据的上传。
请求(Request):APP客户端发送给服务器的数据,根据服务器协议,通知服务器,要求服务器做出数据的筛选,管理或分发。
响应(Respond):服务器接收到APP的请求,会回馈响应。响应包括TCP稳定链接的建立,以及数据的传输。
【注】网络数据传输的常用协议,有TCP和UDP。(了解)
//TCP:首先建立稳定的传输链接,保证传输数据,正确稳定,序列正常,适合传输文件
//UDP:不建立链接,发送方发送数据后,对数据不再负责,快速,但是容易造成丢包,序列紊乱和后发先至,适合即时通讯,或者广播消息。
举例: 淘宝, QQ, 微信,传视频等
【注】数据的请求协议:手机应用开发的绝大多数数据请求协议都是使用http(超文本传输协议)。
主要使用的请求:
<1>Post请求:请求数据不裸露,适合向服务器上传文件等大数据。
<2>get请求:最常用的app数据请求模式,通过裸露的传参方式,将我们请求的数据发送给服务端,服务端解析http协议,根据参数管理,筛选,分发数据,并作出相应响应。用于下载数据。
【注】数据格式JSon(很多,很简单)和Xml(很少,很困难)
//在移动APP当中,服务器发送过来的数据,都是字符串,有两种格式JSon和Xml
//将JSon格式的数据提取出来,保存到数据模型中的过程,称为JSon解析
//将Xml格式的数据提取出来,保存到数据模型中的过程,称为Xml解析
【注】一般客户端流程
发送请求 -> 等待响应 -> 建立链接 ->下载数据 -> 解析数据 -> 存入数据模型 -> mvc 显示到UI
二.网络数据的下载
AFNetworking初步
介绍:AFNetWorking2.0是目前最受开发欢迎的第三方网络框架,里面不但封装了最基本的NSURLConnection而且还封装了iOS7之后的NSURLSession
向下兼容到iOS6,arc+block不用添加任何其他库依赖,json的数据,能自动解析(NSJSONSerialization)
1)AFHTTPRequestOperationManager
*manager=[AFHTTPRequestOperationManager
manager];
拿到数据请求的管理类
2)manager.responseSerializer.acceptableContentTypes=[NSSetsetWithObject:@"application/json”];
告诉manager,需要解析的数据类型(服务端下发给客户端的数据是什么类型的)application/json是json数据
text/xml是xml数据
3)manager.responseSerializer=[AFHTTPResponseSerializerserializer];
将一个新的解析对象 AFHTTPResponseSerializer赋值过去,数据不会再被自动解析
1、对json数据的Get请求
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(AFHTTPRequestOperation *operation,id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation,NSError *error))failure;
三. JSON解析[核心和重点]
<1>Json数据的格式
{}中表示一个字典
[]中表示一个数组
key: value 表示一个键值对
"string" 表示一个字符串
, 表示并列数据
<2> 如何解析
四. SDWebImage异步下载图片
知识补充
/*kvc
key-value-coding
键值编码
kvc 是oc动态语法结构一种使用形式,主要是用来进行赋值取值操作,所有NSObject类型的对象都支持KVC
点语法是特殊的一种kvc
*/
//把value赋值给一个叫name的属性
//程序内部:查找是否有setName方法,有直接赋值,没有就继续查找_name,有就赋值,没有就查找属性名为name的属性
先找get方法,再找_sex,再找sex
//KVC最常用的方法,可以根据字典中的key对model里面的值赋值。(习惯用法:当使用时保持key和属性的名字一致)
// [_stuModel setValuesForKeysWithDictionary:dic];
NSDictionary *dic=@{@"name":@"佐罗",@"sex":@"男",@"friends":@[@"xx.xx",@"xxx.xxx"],@"height":@"186"};
//当没有找到set方法,_属性,属性的时候,它会在model里面找setValue:forUndefinedKey:如果我们没有重写,程序就会崩溃
在model的.m文件中重写-(void)setValue:(id)value
forUndefinedKey:(NSString *)key{
//可以不写打印,写了可以提示自己
NSLog(@"UndefinedKey:%@",key);
}
程序就不会崩溃了
/*kvo
key-value-observer
键值观察,用来观察使用kvc的对象的属性,常用来观察属性值的变化
*/
//第一参数:设置观察者
//第二个参数:观察哪个属性
//第三个参数:观察的属性的哪种变化
//第四个参数写nil
#import "JSONModel.h"
//optinal 功能,当被optinal修饰的时候,代表这个属性可以为空
//@interface DetailModel : JSONModel
//
//@property (nonatomic,copy)NSString<Optional> * name;
//@property (nonatomic,copy)NSDictionary<Optional> * price;
//@end
JSONModel 的使用
@protocol ProductModel
@end
@interface ProductModel :
JSONModel
@property (nonatomic,copy)NSString<Optional>
* name;
@property (nonatomic,copy)NSString<Optional>
* price;
@property (nonatomic,copy)NSString<Optional>
* idOne;
@end
@interface SJLModel :
JSONModel
@property (nonatomic,copy)NSString<Optional>
* idOne;
@property (nonatomic,copy)NSString<Optional>
* name;
@property (nonatomic,copy)NSString<Optional>
* usd;
@property (nonatomic,copy)NSArray<ProductModel,Optional>
* products;
//@property (nonatomic,strong)DetailModel<Optional> * order_details;
@end
#import "SJLModel.h"
@implementation ProductModel
+(JSONKeyMapper *)keyMapper{
return [[JSONKeyMapperalloc]initWithDictionary:@{@"id":@"idOne"}];
}
@end
@implementation SJLModel
//-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
// NSLog(@"UndefinedKey:%@",key);
//}
//用来修改key值的
+(JSONKeyMapper *)keyMapper{
return [[JSONKeyMapperalloc]initWithDictionary:@{@"order_id":@"idOne",@"order_details.name":@"name",@"order_details.price.usd":@"usd",@"order_details.price.products":@"products"}];
}
@end
#import "ViewController.h"
#import "SJLModel.h"
@interface
ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor=[UIColorwhiteColor];
NSString *path=[[NSBundlemainBundle]pathForResource:@"Order"ofType:@"plist"];
NSDictionary *dic=[NSDictionarydictionaryWithContentsOfFile:path];
//JSONModel
中的方法,根据字典创建model
SJLModel *model=[[SJLModelalloc]initWithDictionary:dicerror:nil];
NSLog(@"%@",model.usd);
//根据JSON数据创建model
//第一个参数是JSON字符串
//第二个参数是编码方式
//第三个参数是error
SJLModel *model1=[[SJLModelalloc]initWithString:@""usingEncoding:NSUTF8StringEncodingerror:nil];
基础的例子
{
"id":"123",
"name":"Product name",
"price":12.95
}
嵌套类
{
"order_id":104,
"total_price":13.45,
"product":{
"id":"123",
"name":"Product name",
"price":12.34
}
}
嵌套集合
{
"oder_id":104,
"total_price":103.45,
"products" : [
{
"id":"123",
"name":"Product #1",
"price":12.95
},
{
"id":"137",
"name":"Product #2",
"price":82.95
}
]
}
修改Key值
{
"order_id":104,
"order_details" :
{
"name":"Product#1",
"price":{
"usd":12.95
"products" : [
{
"id":"123",
"name":"Product #1",
"price":12.95
},
{
"id":"137",
"name":"Product #2",
"price":82.95
}
}
}
}
JSON文本和Dictionary的转换
ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];
pm.name = @"Changed Name";
NSDictionary* dict = [pm toDictionary];
NSString* string = [pm toJSONString];
1、通知中心
每个应用程序有且只有一个通知中心的对象(单例),可以理解为广播站。任何对象都可以通过通知中心发送广播,任何对象都可以通过通知中心注册成为某条广播的观察者(具有接收/收听某条广播能力的对象)
1)添加观察者
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(xxx)name:@“message”object:nil];
在通知中心注册self为@“message”广播的观察者,一旦有其他对象发送这条广播,self就能接收到并触发@selector(xxx)方法
2)移除观察者
[[NSNotificationCenterdefaultCenter]removeObserver:selfname:@“message”object:nil];
在通知中心移除self对@“message”的观察
3)发送通知
[[NSNotificationCenterdefaultCenter]postNotificationName:@“message”object:niluserInfo:dic];
对象通过通知中心发送消息,dic的消息会被传到观察者中
请求(Request):APP客户端发送给服务器的数据,根据服务器协议,通知服务器,要求服务器做出数据的筛选,管理或分发。
响应(Respond):服务器接收到APP的请求,会回馈响应。响应包括TCP稳定链接的建立,以及数据的传输。
【注】网络数据传输的常用协议,有TCP和UDP。(了解)
//TCP:首先建立稳定的传输链接,保证传输数据,正确稳定,序列正常,适合传输文件
//UDP:不建立链接,发送方发送数据后,对数据不再负责,快速,但是容易造成丢包,序列紊乱和后发先至,适合即时通讯,或者广播消息。
举例: 淘宝, QQ, 微信,传视频等
【注】数据的请求协议:手机应用开发的绝大多数数据请求协议都是使用http(超文本传输协议)。
主要使用的请求:
<1>Post请求:请求数据不裸露,适合向服务器上传文件等大数据。
<2>get请求:最常用的app数据请求模式,通过裸露的传参方式,将我们请求的数据发送给服务端,服务端解析http协议,根据参数管理,筛选,分发数据,并作出相应响应。用于下载数据。
【注】数据格式JSon(很多,很简单)和Xml(很少,很困难)
//在移动APP当中,服务器发送过来的数据,都是字符串,有两种格式JSon和Xml
//将JSon格式的数据提取出来,保存到数据模型中的过程,称为JSon解析
//将Xml格式的数据提取出来,保存到数据模型中的过程,称为Xml解析
【注】一般客户端流程
发送请求 -> 等待响应 -> 建立链接 ->下载数据 -> 解析数据 -> 存入数据模型 -> mvc 显示到UI
二.网络数据的下载
AFNetworking初步
介绍:AFNetWorking2.0是目前最受开发欢迎的第三方网络框架,里面不但封装了最基本的NSURLConnection而且还封装了iOS7之后的NSURLSession
向下兼容到iOS6,arc+block不用添加任何其他库依赖,json的数据,能自动解析(NSJSONSerialization)
1)AFHTTPRequestOperationManager
*manager=[AFHTTPRequestOperationManager
manager];
拿到数据请求的管理类
2)manager.responseSerializer.acceptableContentTypes=[NSSetsetWithObject:@"application/json”];
告诉manager,需要解析的数据类型(服务端下发给客户端的数据是什么类型的)application/json是json数据
text/xml是xml数据
3)manager.responseSerializer=[AFHTTPResponseSerializerserializer];
将一个新的解析对象 AFHTTPResponseSerializer赋值过去,数据不会再被自动解析
1、对json数据的Get请求
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(AFHTTPRequestOperation *operation,id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation,NSError *error))failure;
三. JSON解析[核心和重点]
<1>Json数据的格式
{}中表示一个字典
[]中表示一个数组
key: value 表示一个键值对
"string" 表示一个字符串
, 表示并列数据
<2> 如何解析
四. SDWebImage异步下载图片
知识补充
/*kvc
key-value-coding
键值编码
kvc 是oc动态语法结构一种使用形式,主要是用来进行赋值取值操作,所有NSObject类型的对象都支持KVC
点语法是特殊的一种kvc
*/
//把value赋值给一个叫name的属性
//程序内部:查找是否有setName方法,有直接赋值,没有就继续查找_name,有就赋值,没有就查找属性名为name的属性
先找get方法,再找_sex,再找sex
//KVC最常用的方法,可以根据字典中的key对model里面的值赋值。(习惯用法:当使用时保持key和属性的名字一致)
// [_stuModel setValuesForKeysWithDictionary:dic];
NSDictionary *dic=@{@"name":@"佐罗",@"sex":@"男",@"friends":@[@"xx.xx",@"xxx.xxx"],@"height":@"186"};
//当没有找到set方法,_属性,属性的时候,它会在model里面找setValue:forUndefinedKey:如果我们没有重写,程序就会崩溃
在model的.m文件中重写-(void)setValue:(id)value
forUndefinedKey:(NSString *)key{
//可以不写打印,写了可以提示自己
NSLog(@"UndefinedKey:%@",key);
}
程序就不会崩溃了
/*kvo
key-value-observer
键值观察,用来观察使用kvc的对象的属性,常用来观察属性值的变化
*/
//第一参数:设置观察者
//第二个参数:观察哪个属性
//第三个参数:观察的属性的哪种变化
//第四个参数写nil
#import "JSONModel.h"
//optinal 功能,当被optinal修饰的时候,代表这个属性可以为空
//@interface DetailModel : JSONModel
//
//@property (nonatomic,copy)NSString<Optional> * name;
//@property (nonatomic,copy)NSDictionary<Optional> * price;
//@end
JSONModel 的使用
@protocol ProductModel
@end
@interface ProductModel :
JSONModel
@property (nonatomic,copy)NSString<Optional>
* name;
@property (nonatomic,copy)NSString<Optional>
* price;
@property (nonatomic,copy)NSString<Optional>
* idOne;
@end
@interface SJLModel :
JSONModel
@property (nonatomic,copy)NSString<Optional>
* idOne;
@property (nonatomic,copy)NSString<Optional>
* name;
@property (nonatomic,copy)NSString<Optional>
* usd;
@property (nonatomic,copy)NSArray<ProductModel,Optional>
* products;
//@property (nonatomic,strong)DetailModel<Optional> * order_details;
@end
#import "SJLModel.h"
@implementation ProductModel
+(JSONKeyMapper *)keyMapper{
return [[JSONKeyMapperalloc]initWithDictionary:@{@"id":@"idOne"}];
}
@end
@implementation SJLModel
//-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
// NSLog(@"UndefinedKey:%@",key);
//}
//用来修改key值的
+(JSONKeyMapper *)keyMapper{
return [[JSONKeyMapperalloc]initWithDictionary:@{@"order_id":@"idOne",@"order_details.name":@"name",@"order_details.price.usd":@"usd",@"order_details.price.products":@"products"}];
}
@end
#import "ViewController.h"
#import "SJLModel.h"
@interface
ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor=[UIColorwhiteColor];
NSString *path=[[NSBundlemainBundle]pathForResource:@"Order"ofType:@"plist"];
NSDictionary *dic=[NSDictionarydictionaryWithContentsOfFile:path];
//JSONModel
中的方法,根据字典创建model
SJLModel *model=[[SJLModelalloc]initWithDictionary:dicerror:nil];
NSLog(@"%@",model.usd);
//根据JSON数据创建model
//第一个参数是JSON字符串
//第二个参数是编码方式
//第三个参数是error
SJLModel *model1=[[SJLModelalloc]initWithString:@""usingEncoding:NSUTF8StringEncodingerror:nil];
基础的例子
{
"id":"123",
"name":"Product name",
"price":12.95
}
嵌套类
{
"order_id":104,
"total_price":13.45,
"product":{
"id":"123",
"name":"Product name",
"price":12.34
}
}
嵌套集合
{
"oder_id":104,
"total_price":103.45,
"products" : [
{
"id":"123",
"name":"Product #1",
"price":12.95
},
{
"id":"137",
"name":"Product #2",
"price":82.95
}
]
}
修改Key值
{
"order_id":104,
"order_details" :
{
"name":"Product#1",
"price":{
"usd":12.95
"products" : [
{
"id":"123",
"name":"Product #1",
"price":12.95
},
{
"id":"137",
"name":"Product #2",
"price":82.95
}
}
}
}
JSON文本和Dictionary的转换
ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];
pm.name = @"Changed Name";
NSDictionary* dict = [pm toDictionary];
NSString* string = [pm toJSONString];
1、通知中心
每个应用程序有且只有一个通知中心的对象(单例),可以理解为广播站。任何对象都可以通过通知中心发送广播,任何对象都可以通过通知中心注册成为某条广播的观察者(具有接收/收听某条广播能力的对象)
1)添加观察者
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(xxx)name:@“message”object:nil];
在通知中心注册self为@“message”广播的观察者,一旦有其他对象发送这条广播,self就能接收到并触发@selector(xxx)方法
2)移除观察者
[[NSNotificationCenterdefaultCenter]removeObserver:selfname:@“message”object:nil];
在通知中心移除self对@“message”的观察
3)发送通知
[[NSNotificationCenterdefaultCenter]postNotificationName:@“message”object:niluserInfo:dic];
对象通过通知中心发送消息,dic的消息会被传到观察者中
相关文章推荐
- Android访问网络系列之--服务端返回XML或JSON格式数据,Android 进行解析并显示
- 网络解析(XML,JSON)
- OC&nbsp;之&nbsp;KVO、KVC、通知(笔记)
- AFNetworking和JSONModel组合成 IOS 底层网络框架
- KVC、KVO、通知
- Android获取网络XML/JSON数据
- QF——网络之JSON解析和XML解析
- KVC键值码,KVO键值观察,通知NSNotification
- kvc、kvo、通知
- Android访问网络:服务端返回XML或JSON格式数据,Android 进行解析并使用ListView显示
- IOS 网络解析(XML,JSON)
- Android 解析网络数据传输JSON或XML对象
- ios网络编程专题总结(重要)---webservice,xml,json,soap,asihttp
- 网络json 和xml 接口
- Android访问网络系列之--服务端返回XML或JSON格式数据,Android 进行解析并显示
- android 解析网络xml数据,发送xml数据,解析json数据
- json xml 网络请求是用的传输数据的格式
- KVC、KVO、通知
- 网络通信框架Volley之二——访问服务器获取Json.xml数据和详细的解析数据
- 用 KVC 自动把 JSON 转 Model