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模型闲聊二

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容