通知,JSONMOdel,kvo,kvc,网络,xml

来源:互联网 发布:淘宝店铺被屏蔽怎么办 编辑:程序博客网 时间:2024/06/06 08:24

大多数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/jsonjson数据  text/xmlxml数据


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最常用的方法,可以根据字典中的keymodel里面的值赋值。(习惯用法:当使用时保持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:@“messageobject:nil];

在通知中心注册self@“message广播的观察者,一旦有其他对象发送这条广播,self就能接收到并触发@selector(xxx)方法

2)移除观察者

[[NSNotificationCenterdefaultCenter] removeObserver:selfname:@“messageobject:nil];

在通知中心移除self对@“message的观察

3)发送通知

[[NSNotificationCenterdefaultCenter] postNotificationName:@“messageobject:nil userInfo:dic];

对象通过通知中心发送消息,dic的消息会被传到观察者中


0 0
原创粉丝点击