iOS开发——网络请求数据处理
之前博客中介绍了iOS中常用的网络框架AFNetworking,其中常用的POST请求方法如下:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"Error: %@", error);
}];
我们可以看到请求成功后返回给我们的是一个已经解析好的数据字典responseObject,然后我们需要做的就是处理这个数据字典。处理字典常用的方法是利用KVC字典转模型。字典转模型我这里总结两种方法:(1)自己编写代码 (2)利用第三方框架MJExtension
1.自己编写代码(只使用与简单的字典转模型)
假如字典如下:
NSDictionary *dict = @{@"name" : @"Jack", @"icon" : @"lufy.png", @"age" : @20
};
建立模型User,User.h中代码如下:
@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *icon;
@property (assign, nonatomic) int age;
+(instancetype)accountWithDict:(NSDictionary *)dic;
@end
User.m中代码如下:
// 使用KVC 字典转模型 如此方便,省去了大量的赋值代码
+(instancetype)accountWithDict:(NSDictionary *)dic
{User *user = [[self alloc] init];[user setValuesForKeysWithDictionary:dic];return user;
}
然后我们就可以直接利用User的类方法+(instancetype)accountWithDict:(NSDictionary *)dic来实现字典转模型。
2.利用第三方框架MJExtension(建议使用)
MJExtension is a fast, convenient and nonintrusive conversion between JSON and model.
MJExtension是一个转换速度快、使用简单方便的字典转模型框架
使用前先将MJExtensionExample/MJExtensionExample/MJExtension文件夹中的所有源代码拽入项目中
导入主头文件:#import "MJExtension.h"
MJExtension.h
MJConst.h
MJConst.m
MJFoundation.h
MJFoundation.m
MJIvar.h
MJIvar.m
MJType.h
MJType.m
NSObject+MJCoding.h
NSObject+MJCoding.m
NSObject+MJIvar.h
NSObject+MJIvar.m
NSObject+MJKeyValue.h
NSObject+MJKeyValue.m
(1)最简单的字典转模型
typedef enum {SexMale,SexFemale
} Sex;@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *icon;
@property (assign, nonatomic) unsigned int age;
@property (copy, nonatomic) NSString *height;
@property (strong, nonatomic) NSNumber *money;
@property (assign, nonatomic) Sex sex;
@property (assign, nonatomic, getter=isGay) BOOL gay;
@end/***********************************************/NSDictionary *dict = @{@"name" : @"Jack",@"icon" : @"lufy.png",@"age" : @20,@"height" : @"1.55",@"money" : @100.9,@"sex" : @(SexFemale),@"gay" : @"true"
// @"gay" : @"1"
// @"gay" : @"NO"
};// JSON -> User
User *user = [User mj_objectWithKeyValues:dict];NSLog(@"name=%@, icon=%@, age=%zd, height=%@, money=%@, sex=%d, gay=%d", user.name, user.icon, user.age, user.height, user.money, user.sex, user.gay);
// name=Jack, icon=lufy.png, age=20, height=1.550000, money=100.9, sex=1
(2)模型中嵌套模型
@interface Status : NSObject
@property (copy, nonatomic) NSString *text;
@property (strong, nonatomic) User *user;
@property (strong, nonatomic) Status *retweetedStatus;
@end/***********************************************/NSDictionary *dict = @{@"text" : @"Agree!Nice weather!",@"user" : @{@"name" : @"Jack",@"icon" : @"lufy.png"},@"retweetedStatus" : @{@"text" : @"Nice weather!",@"user" : @{@"name" : @"Rose",@"icon" : @"nami.png"}}
};// JSON -> Status
Status *status = [Status mj_objectWithKeyValues:dict];NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
// text=Agree!Nice weather!, name=Jack, icon=lufy.pngNSString *text2 = status.retweetedStatus.text;
NSString *name2 = status.retweetedStatus.user.name;
NSString *icon2 = status.retweetedStatus.user.icon;
NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);
// text2=Nice weather!, name2=Rose, icon2=nami.png
(3)模型中有个数组属性,数组里面又要装着其他模型
@interface Ad : NSObject
@property (copy, nonatomic) NSString *image;
@property (copy, nonatomic) NSString *url;
@end@interface StatusResult : NSObject
/** Contatins status model */
@property (strong, nonatomic) NSMutableArray *statuses;
/** Contatins ad model */
@property (strong, nonatomic) NSArray *ads;
@property (strong, nonatomic) NSNumber *totalNumber;
@end/***********************************************/// Tell MJExtension what type model will be contained in statuses and ads.
[StatusResult mj_setupObjectClassInArray:^NSDictionary *{return @{@"statuses" : @"Status",// @"statuses" : [Status class],@"ads" : @"Ad"// @"ads" : [Ad class]};
}];
// Equals: StatusResult.m implements +mj_objectClassInArray method.NSDictionary *dict = @{@"statuses" : @[@{@"text" : @"Nice weather!",@"user" : @{@"name" : @"Rose",@"icon" : @"nami.png"}},@{@"text" : @"Go camping tomorrow!",@"user" : @{@"name" : @"Jack",@"icon" : @"lufy.png"}}],@"ads" : @[@{@"image" : @"ad01.png",@"url" : @"http://www.ad01.com"},@{@"image" : @"ad02.png",@"url" : @"http://www.ad02.com"}],@"totalNumber" : @"2014"
};// JSON -> StatusResult
StatusResult *result = [StatusResult mj_objectWithKeyValues:dict];NSLog(@"totalNumber=%@", result.totalNumber);
// totalNumber=2014// Printing
for (Status *status in result.statuses) {NSString *text = status.text;NSString *name = status.user.name;NSString *icon = status.user.icon;NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
}
// text=Nice weather!, name=Rose, icon=nami.png
// text=Go camping tomorrow!, name=Jack, icon=lufy.png// Printing
for (Ad *ad in result.ads) {NSLog(@"image=%@, url=%@", ad.image, ad.url);
}
// image=ad01.png, url=http://www.ad01.com
// image=ad02.png, url=http://www.ad02.com
(4)模型中的属性名和字典中的key不相同(或者需要多级映射)
@interface Bag : NSObject
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) double price;
@end@interface Student : NSObject
@property (copy, nonatomic) NSString *ID;
@property (copy, nonatomic) NSString *desc;
@property (copy, nonatomic) NSString *nowName;
@property (copy, nonatomic) NSString *oldName;
@property (copy, nonatomic) NSString *nameChangedTime;
@property (strong, nonatomic) Bag *bag;
@end/***********************************************/// How to map
[Student mj_setupReplacedKeyFromPropertyName:^NSDictionary *{return @{@"ID" : @"id",@"desc" : @"desciption",@"oldName" : @"name.oldName",@"nowName" : @"name.newName",@"nameChangedTime" : @"name.info[1].nameChangedTime",@"bag" : @"other.bag"};
}];
// Equals: Student.m implements +mj_replacedKeyFromPropertyName method.NSDictionary *dict = @{@"id" : @"20",@"desciption" : @"kids",@"name" : @{@"newName" : @"lufy",@"oldName" : @"kitty",@"info" : @[@"test-data",@{@"nameChangedTime" : @"2013-08"}]},@"other" : @{@"bag" : @{@"name" : @"a red bag",@"price" : @100.7}}
};// JSON -> Student
Student *stu = [Student mj_objectWithKeyValues:dict];// Printing
NSLog(@"ID=%@, desc=%@, oldName=%@, nowName=%@, nameChangedTime=%@",stu.ID, stu.desc, stu.oldName, stu.nowName, stu.nameChangedTime);
// ID=20, desc=kids, oldName=kitty, nowName=lufy, nameChangedTime=2013-08
NSLog(@"bagName=%@, bagPrice=%f", stu.bag.name, stu.bag.price);
// bagName=a red bag, bagPrice=100.700000
(5)将一个字典数组转成模型数组
NSArray *dictArray = @[@{@"name" : @"Jack",@"icon" : @"lufy.png"},@{@"name" : @"Rose",@"icon" : @"nami.png"}];// JSON array -> User array
NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];// Printing
for (User *user in userArray) {NSLog(@"name=%@, icon=%@", user.name, user.icon);
}
// name=Jack, icon=lufy.png
// name=Rose, icon=nami.png
(6)将一个模型转成字典
// New model
User *user = [[User alloc] init];
user.name = @"Jack";
user.icon = @"lufy.png";Status *status = [[Status alloc] init];
status.user = user;
status.text = @"Nice mood!";// Status -> JSON
NSDictionary *statusDict = status.mj_keyValues;
NSLog(@"%@", statusDict);
/*{text = "Nice mood!";user = {icon = "lufy.png";name = Jack;};}*/// More complex situation
Student *stu = [[Student alloc] init];
stu.ID = @"123";
stu.oldName = @"rose";
stu.nowName = @"jack";
stu.desc = @"handsome";
stu.nameChangedTime = @"2018-09-08";Bag *bag = [[Bag alloc] init];
bag.name = @"a red bag";
bag.price = 205;
stu.bag = bag;NSDictionary *stuDict = stu.mj_keyValues;
NSLog(@"%@", stuDict);
/*
{ID = 123;bag = {name = "\U5c0f\U4e66\U5305";price = 205;};desc = handsome;nameChangedTime = "2018-09-08";nowName = jack;oldName = rose;
}*/
(7)将一个模型数组转成字典数组
// New model array
User *user1 = [[User alloc] init];
user1.name = @"Jack";
user1.icon = @"lufy.png";User *user2 = [[User alloc] init];
user2.name = @"Rose";
user2.icon = @"nami.png";NSArray *userArray = @[user1, user2];// Model array -> JSON array
NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray];
NSLog(@"%@", dictArray);
/*({icon = "lufy.png";name = Jack;},{icon = "nami.png";name = Rose;})*/
iOS开发——网络请求数据处理相关推荐
- iOS开发——网络请求案例汇总(AFNetworking)
我在之前一篇博客中实现了使用NSURLConnection或者NSURLSession来请求网络数据,用的都是苹果自带的方法.请参考<iOS开发--网络请求案例汇总>.现在我们使用最流行的 ...
- iOS开发——网络请求案例汇总
在实际的项目开发中,连接网络是每一款App必不可少的基本功能.对于客户端的网络请求而言,无非是有两个实现方向:使用网络请求框架或者不使用网络请求框架.在这篇博客中,我将用苹果自带的网络请求方式(不使用 ...
- iOS开发网络篇—多线程断点下载
iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...
- iOS开发网络篇—使用ASI框架进行文件下载
iOS开发网络篇-使用ASI框架进行文件下载 说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYView ...
- iOS开发网络篇—数据缓存
iOS开发网络篇-数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以 ...
- 02.iOS开发网络篇—HTTP协议
iOS开发网络篇-HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...
- iOS开发网络篇—搭建本地服务器
iOS开发网络篇-搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...
- Method-Swizzling实战-实现iOS原生网络请求性能采集
一.方法交换实现步骤(实例方法和类方法处理逻辑类似) 1.检查原类(要被替换方法的类)的原实例方法是否存在,如果不存在,则不交换: 2.检查新类(最终被使用的方法所在的类)的新实例方法是否存在,如果不 ...
- ios获取网络请求失败相关数据
ios获取网络请求失败相关数据 很多时候和后台处理数据的时候很多时候后台会在网络请求失败的某些不同情况下带回不同的数据这个时候如何获取数据及拿到需要处理的数据: //如果请求失败 对象是NSURLSe ...
最新文章
- 文件读写以及数据处理
- 吴恩达的 AI 战略强调了什么?
- 输入梯度惩罚与参数梯度惩罚的一个不等式
- Lecture4_14_2.多维随机变量及其概率分布
- SynchronousQueue详解
- [1197]约瑟夫问题 (循环链表)SDUT
- linux防火墙服务关闭,Linux防火墙(firewall)的开启与关闭
- ios app被自己从应用商店下架后可以再恢復上架吗
- 第 20 次 CSP认证 202009-4 星际旅行
- Java 1.3 控制流程(条件语句、循环结构)
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
- 关于 react createFactory 的小技巧
- OpenCV】透视变换 Perspective Transformation(续)
- 防火墙放开oracle远程,oracleMTS模式下防火墙如何开通
- HBuilderX使用mac打包ios应用提示苹果根证书没有安装
- php十六进制加1,二进制110000转化为十六进制
- 机器学习——马氏距离
- Thinkpad E430 移除网卡白名单
- android模拟奥克斯空调红外,奥克斯空调手机遥控器
- LaTeX 参考文献的处理