所謂模型套模型,一般就是我們數(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模型閑聊二