Model套Model之iOS模型閑聊

所謂模型套模型,一般就是我們數(shù)據(jù)返回的是字典類型數(shù)組,于此同時這個字典類型里也有一個數(shù)組,而這個數(shù)組又是字典類型的!
是不是有點繞呢,放下Data一看就明白了!

data = [
 {
    address = 北京市 北京市 豐臺區(qū) 某某街,
    totalAmt = 0,
    favouredBillId = 0,
    realAmt = 0,
    tradeNum = 1,
    status = 0,
    tradeList = 105,103,
    yunAmt = 0,
    favouredMethod = ,
    tuanUser = [
 ],
    payedMethod = ,
    shopCartList = [
 {
    id = 105,
    unit = 千克,
    shopUserName = 北京市大興區(qū),
    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 = 北京市大興區(qū),
    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
 }
 ],

項目中是不是會經(jīng)常遇到這種模型套型的情況,現(xiàn)以上為栗子, 這里的 data 是訂單數(shù)組(暫叫一級 訂單model), data 下有個shopCartList訂單里的商品數(shù)組(暫叫二級 商品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;

// 選擇商品噸數(shù)量值
@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; // 申請中--待支付--已支付--待發(fā)貨--發(fā)貨中--確認收貨--訂單完成(再次購買)--退貨申請--退貨中--退貨成功

@interface XHHMyOrderModel : NSObject

// 訂單號
@property (nonatomic, copy) NSString *orderNo;

// 訂單狀態(tài)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;

// 商品件數(shù)
@property (nonatomic, assign) NSInteger tradeNum;

// 商品數(shù)組
@property (nonatomic, strong) NSArray *shopCartList;

// 產(chǎn)品實際支付
@property (nonatomic, assign) double realAmt;

@property (nonatomic, assign) double totalAmt;

// 總產(chǎn)品實際支付
@property (nonatomic, assign) double countMoney;

// 總運費
@property (nonatomic, assign) double yunAmt;

// 團購, 1為是
@property (nonatomic, assign) BOOL isTuan;

// 團購合伙人號碼
@property (nonatomic, strong) NSArray *tuanUser;

// 團購交易總計噸數(shù)
@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] };
}

二. 電商產(chǎn)品中訂單類較多會出現(xiàn)類似下面界面:


由于我們的后臺比較任性,商品總件數(shù)及實際付款不在一級訂單 model 里返回,而是在二級商品中需要我們前臺去做加法把二級商品數(shù)組 里的價格數(shù)據(jù)相加得到總價錢!

簡單方法來說, 我們可以在View 里給 Model模型 賦值時做處理:

// model賦值
- (void)setModel:(XHHMyOrderModel *)model {
    
    _model = model;
    
    // 取出子 Model 的每張圖片
    NSArray *imgArray = [model.shopCartList valueForKeyPath:@"shopImg"];
    // 數(shù)組里面 商品價格和
    NSNumber *countMoney = [model valueForKeyPath:@"shopCartList.@sum.countMoney"]; 
    // 數(shù)組里面 運費和
    NSNumber *yunPrice = [model valueForKeyPath:@"shopCartList.@sum.yunPrice"]; 
    // 實際價格
    CGFloat realAmt = [countMoney doubleValue] + [yunPrice doubleValue]; 
}

當然也可以在 Controller 里取出數(shù)據(jù),在 dateSource 里從字典里循環(huán)拿出每件商品價格相加得到總價格

三. 當訂單創(chuàng)建 OK 時,這個時候進入訂單詳情查詢訂單時,同樣是這種模型套模型的數(shù)據(jù),但因其界面性,我選擇使用多分區(qū)來展現(xiàn)訂單詳情,第三個分區(qū)來展現(xiàn) 商品View, 通過兩套MVC來展現(xiàn)整個界面!

1.先截取查詢訂單網(wǎng)絡請求部分代碼:

if ([json[@"data"] count]) {
                
                weakSelf.yunAmt = 0.00; // 總運費
                weakSelf.realAmt = 0.00; // 總價格
                
            // 訂單 model 下的訂單數(shù)據(jù)
                weakSelf.myOrderModel = [XHHMyOrderModel loadMyOrderInfoFromJson:json[@"data"]][0];
                
                if ([json[@"data"][0][@"shopCartList"] count]) {
                    
                    // 循環(huán)相加數(shù)組里字典的運費 得到總運費及總價格
                    for (NSDictionary *dic in json[@"data"][0][@"shopCartList"]) {
                        
                        weakSelf.yunAmt = weakSelf.yunAmt + [dic[@"yunPrice"] doubleValue];
                        weakSelf.realAmt = weakSelf.realAmt + [dic[@"countMoney"] doubleValue];
                        
                    }
                 // 子 Model下的商品列表數(shù)據(jù)
                  [weakSelf.goodList addObjectsFromArray:[XHHOrderModel loadOrderInfoFromJson:json[@"data"][0][@"shopCartList"]]];
                    
                } else {
                    [MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]];
                }
         
            }
        }
        [weakSelf.tableView reloadData];

2.接著通過訂單 MVC 和商品 MVC 來相對應數(shù)據(jù)處理及展示,抽取核心代碼:

#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;
}

當商品數(shù)據(jù)多與一條時,則 商品MVC效果比較明顯啦~


PS:
類似于這種訂單類思路,在產(chǎn)生訂單號前我們需要自己去計算總價或者是否會員價之類的,但是一旦產(chǎn)生訂單后,所有關于 值類數(shù)據(jù)都必須從訂單詳情數(shù)據(jù)里去取,而不是自己去計算!

是不是現(xiàn)在覺得邏輯順了很多呢,看到這了,希望對你有幫助喲本寶寶要去洗漱啦,晚安,各位程序媛程序猿們

如果想看類似索引那種類型的Model 套 Model, 請移步類似索引Model套Model之 iOS模型閑聊二

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阱持,一起剝皮案震驚了整個濱河市冰寻,隨后出現(xiàn)的幾起案子述暂,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘾杭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門哪亿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粥烁,“玉大人,你說我怎么就攤上這事蝇棉√肿瑁” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵篡殷,是天一觀的道長钝吮。 經(jīng)常有香客問我,道長贴唇,這世上最難降的妖魔是什么搀绣? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任飞袋,我火速辦了婚禮戳气,結果婚禮上,老公的妹妹穿的比我還像新娘巧鸭。我一直安慰自己瓶您,他們只是感情好,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布纲仍。 她就那樣靜靜地躺著呀袱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪郑叠。 梳的紋絲不亂的頭發(fā)上夜赵,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音乡革,去河邊找鬼寇僧。 笑死,一個胖子當著我的面吹牛沸版,可吹牛的內(nèi)容都是我干的嘁傀。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼视粮,長吁一口氣:“原來是場噩夢啊……” “哼细办!你這毒婦竟也來了?” 一聲冷哼從身側響起蕾殴,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤笑撞,失蹤者是張志新(化名)和其女友劉穎岛啸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茴肥,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡值戳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炉爆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堕虹。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芬首,靈堂內(nèi)的尸體忽然破棺而出赴捞,到底是詐尸還是另有隱情,我是刑警寧澤郁稍,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布赦政,位于F島的核電站,受9級特大地震影響耀怜,放射性物質發(fā)生泄漏恢着。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一财破、第九天 我趴在偏房一處隱蔽的房頂上張望掰派。 院中可真熱鬧,春花似錦左痢、人聲如沸靡羡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽略步。三九已至,卻和暖如春定页,著一層夾襖步出監(jiān)牢的瞬間免都,已是汗流浹背魁兼。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工日麸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撵术,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓宫峦,卻偏偏與公主長得像岔帽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子导绷,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容