Model套Model之iOS模型闲聊

2017-01-13 15:18:10来源:http://www.jianshu.com/p/180cfe5da413作者:smile丽语人点击

第七城市

所谓模型套模型,一般就是我们数据返回的是字典类型数组,于此同时这个字典类型里也有一个数组,而这个数组又是字典类型的!
是不是有点绕呢,放下Data一看就明白了!


data = [
{
address = 北京市 北京市 丰台区 某某街,
totalAmt = 0,
favouredBillId = 0,
realAmt = 0,
tradeNum = 1,
status = 0,
tradeList = 105,103,
yunAmt = 0,
favouredMethod = ,
tuanUser = [
],
payedMethod = ,
shopCartList = [
{
id = 105,
unit = 千克,
shopUserName = 北京市大兴区,
isYun = 0,
shopPrice = 777,
countMoney = 777,
shopInfo = ,
shopImg = /commodityImg/abcs3B.jpg,
createDate = 1478138532000,
tuanPrice = 0,
count = 2,
state = 1,
userId = 10,
yunPrice = 0,
orderId = 20161103100225800744,
shopId = 10,
shopVipPrice = 222,
shopName = 猪猪饲料11
},
{
id = 103,
unit = 吨,
shopUserName = 北京市大兴区,
isYun = 0,
shopPrice = 1111,
countMoney = 2222,
shopInfo = ,
shopImg = /commodityImg/abcs3B.jpg,
createDate = 1478138504000,
tuanPrice = 0,
count = 2,
state = 1,
userId = 10,
yunPrice = 0,
orderId = 20161103100225800744,
shopId = 11,
shopVipPrice = 609,
shopName = 猪猪饲料12
}
],
name = 张smile,
id = 65,
orderNo = 20161103100225800744,
paySource = ,
phone = 12345678900,
isTuan = 0,
payedTime = <null>,
orderTime = 1478138545000,
favouredBill = 0,
favouredAmt = 0,
userId = 10
}
],

项目中是不是会经常遇到这种模型套型的情况,现以上为栗子, 这里的 data 是订单数组(暂叫一级 订单model), data 下有个shopCartList订单里的商品数组(暂叫二级 商品model).


一. 这类情况最好写两个 Model,便于后面各种逻辑赋值等等

1.每个订单里的商品模型XHHOrderModel


#import <Foundation/Foundation.h>
@interface XHHOrderModel : NSObject
// 商品id
@property (nonatomic, copy) NSString *shopId;
// 商品图片url
@property (nonatomic, copy) NSString *shopImg;
// 商品名称
@property (nonatomic, copy) NSString *shopName;
// 普通价格
@property (nonatomic, assign) double shopPrice;
// vip价格
@property (nonatomic, assign) double shopVipPrice;
// 团购价格
@property (nonatomic, assign) double tuanPrice;
// 当前商品运费
@property (nonatomic, assign) double yunPrice;
// 当前商品总价格(运费除外)
@property (nonatomic, assign) double countMoney;
// 是否是预估运费还是实际运费 0预估 1修改地址 2实际
@property (nonatomic, copy) NSString *isYun;
// 单位
@property (nonatomic, copy) NSString *unit;
// 选择商品吨数量值
@property (nonatomic, assign) NSInteger count;
+ (NSArray *)loadOrderInfoFromJson:(NSArray *)array;

子Model 的. m 文件就是简单的转换模型了;


#import "XHHOrderModel.h"
#import "MJExtension.h"
@implementation XHHOrderModel
+ (NSArray *)loadOrderInfoFromJson:(NSArray *)array {
return [self objectArrayWithKeyValuesArray:array].copy;
}
- (double)countMoney {
return _shopPrice * self.count;
}

2.我的订单模型 XHHMyOrderModel


#import <Foundation/Foundation.h>
// 类型枚举
typedef enum {
XHHOrderStatus_all = 0, // 全部订单
XHHOrderStatus_complete, // 再次购买(订单完成)
XHHOrderStatus_applying, //申请中
XHHOrderStatus_toBePaid, //待支付
XHHOrderStatus_salesReturnApply, //退货申请
XHHOrderStatus_salesReturning, //退货中
XHHOrderStatus_salesReturned, //退货成功
} XHHOrderStatus; // 申请中--待支付--已支付--待发货--发货中--确认收货--订单完成(再次购买)--退货申请--退货中--退货成功
@interface XHHMyOrderModel : NSObject
// 订单号
@property (nonatomic, copy) NSString *orderNo;
// 订单状态status
@property (nonatomic, assign) XHHOrderStatus status;
// 订单时间
@property (nonatomic, copy) NSString *orderTime;
// 下单时间
@property (nonatomic, copy) NSString *payedTime;
// 姓名收货人
@property (nonatomic, copy) NSString *name;
// 地址
@property (nonatomic, copy) NSString *address;
// 电话
@property (nonatomic, copy) NSString *phone;
// 商品件数
@property (nonatomic, assign) NSInteger tradeNum;
// 商品数组
@property (nonatomic, strong) NSArray *shopCartList;
// 产品实际支付
@property (nonatomic, assign) double realAmt;
@property (nonatomic, assign) double totalAmt;
// 总产品实际支付
@property (nonatomic, assign) double countMoney;
// 总运费
@property (nonatomic, assign) double yunAmt;
// 团购, 1为是
@property (nonatomic, assign) BOOL isTuan;
// 团购合伙人号码
@property (nonatomic, strong) NSArray *tuanUser;
// 团购交易总计吨数
@property (nonatomic, assign) NSInteger tradeList;
+ (NSArray *)loadMyOrderInfoFromJson:(NSArray *)array;

至于一级订单Model 的.m 文件就一定要注意了,套模型!!!


#import "XHHMyOrderModel.h"
#import "MJExtension.h"
#import "NSString+XHHTime.h"
#import "XHHOrderModel.h"
@implementation XHHMyOrderModel
+ (NSArray *)loadMyOrderInfoFromJson:(NSArray *)array {
return [self objectArrayWithKeyValuesArray:array].copy;
}
// 将时间戳转化为时间
- (NSString *)orderTime {
return [_orderTime timeChangeWithDateFormat:@"yyyy-MM-dd hh:mm"];
}
// 将时间戳转化为时间
- (NSString *)payedTime {
return [_payedTime timeChangeWithDateFormat:@"yyyy-MM-dd hh:mm"];
}
+ (NSDictionary *)objectClassInArray {
return @{@"shopCartList" : [XHHOrderModel class] };
}

二. 电商产品中订单类较多会出现类似下面界面:


由于我们的后台比较任性,商品总件数及实际付款不在一级订单 model 里返回,而是在二级商品中需要我们前台去做加法把二级商品数组 里的价格数据相加得到总价钱!


简单方法来说, 我们可以在View 里给 Model模型 赋值时做处理:


// model赋值
- (void)setModel:(XHHMyOrderModel *)model {
_model = model;
// 取出子 Model 的每张图片
NSArray *imgArray = [model.shopCartList valueForKeyPath:@"shopImg"];
// 数组里面 商品价格和
NSNumber *countMoney = [model valueForKeyPath:@"shopCartList.@sum.countMoney"];
// 数组里面 运费和
NSNumber *yunPrice = [model valueForKeyPath:@"shopCartList.@sum.yunPrice"];
// 实际价格
CGFloat realAmt = [countMoney doubleValue] + [yunPrice doubleValue];
}

当然也可以在 Controller 里取出数据,在 dateSource 里从字典里循环拿出每件商品价格相加得到总价格


三. 当订单创建 OK 时,这个时候进入订单详情查询订单时,同样是这种模型套模型的数据,但因其界面性,我选择使用多分区来展现订单详情,第三个分区来展现 商品View, 通过两套MVC来展现整个界面!


1.先截取查询订单网络请求部分代码:


if ([json[@"data"] count]) {
weakSelf.yunAmt = 0.00; // 总运费
weakSelf.realAmt = 0.00; // 总价格
// 订单 model 下的订单数据
weakSelf.myOrderModel = [XHHMyOrderModel loadMyOrderInfoFromJson:json[@"data"]][0];
if ([json[@"data"][0][@"shopCartList"] count]) {
// 循环相加数组里字典的运费 得到总运费及总价格
for (NSDictionary *dic in json[@"data"][0][@"shopCartList"]) {
weakSelf.yunAmt = weakSelf.yunAmt + [dic[@"yunPrice"] doubleValue];
weakSelf.realAmt = weakSelf.realAmt + [dic[@"countMoney"] doubleValue];
}
// 子 Model下的商品列表数据
[weakSelf.goodList addObjectsFromArray:[XHHOrderModel loadOrderInfoFromJson:json[@"data"][0][@"shopCartList"]]];
} else {
[MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]];
}
}
}
[weakSelf.tableView reloadData];
`

2.接着通过订单 MVC 和商品 MVC 来相对应数据处理及展示,抽取核心代码:


#pragma mark - Table view data source
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0) {
cell.textLabel.text = [NSString stringWithFormat:@"订单号: %@", self.orderNo];
} else if (indexPath.section == 1) { // 一级订单 Model
XHHOrderAddressCell *cell = [XHHOrderAddressCell cellWithTableView:tableView];
cell.model = self.myOrderModel;
return cell;
} else if (indexPath.section == 2) { // 二级商品 Model
XHHOrderGoodCell *cell = [XHHOrderGoodCell cellWithTableView:tableView];
if (self.goodList.count) {
XHHOrderModel *model = self.goodList[indexPath.row];
cell.model = model;
}
return cell;
}
return cell;
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
if (indexPath.section == 1) {
return XHHOrderAddressCellHeight;
} else if (indexPath.section == 2) {
return XHHOrderGoodCellHeight;
}
return 40;
}
`

当商品数据多与一条时,则 商品MVC效果比较明显啦~




PS:
类似于这种订单类思路,在产生订单号前我们需要自己去计算总价或者是否会员价之类的,但是一旦产生订单后,所有关于 值类数据都必须从订单详情数据里去取,而不是自己去计算!


是不是现在觉得逻辑顺了很多呢,看到这了,希望对你有帮助哟~本宝宝要去洗漱啦,晚安,各位程序媛程序猿们~




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台