Model套Model之iOS模型闲聊

所谓模型套模型,一般就是我们数据返回的是字典类型数组,于此同时这个字典类型里也有一个数组,而这个数组又是字典类型的! 是不是有点绕呢,放下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: 类似于这种订单类思路,在产生订单号前我们需要自己去计算总价或者是否会员价之类的,但是一旦产生订单后,所有关于 值类数据都必须从订单详情数据里去取,而不是自己去计算!

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

如果想看类似索引那种类型的Model 套 Model, 请移步类似索引Model套Model之 iOS模型闲聊二

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值