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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容