網(wǎng)上關(guān)于MVVM的介紹太多产艾,我不再啰嗦了疤剑,直接上干貨滑绒。
ps:沒(méi)使用任何第三方,適合剛接觸MVVM的同學(xué)拿來(lái)參考隘膘,如果您已是高手疑故,希望您能提出寶貴意見(jiàn)。謝謝
架構(gòu)還是有必要了解一下的
MVVM架構(gòu)圖解.png
項(xiàng)目結(jié)構(gòu)目錄.png
都知道目錄是這樣弯菊,里面代碼邏輯怎么實(shí)現(xiàn)呢纵势?詳見(jiàn)頁(yè)底demo傳送門
1、Controller 負(fù)責(zé) ViewManager 與 ViewModel 之間的綁定
在這里你只需import
兩個(gè)文件ViewManger
管钳,CustomViewModel
.m 全部代碼
#import "FirstVC.h"
#import "ViewManager.h"
#import "CustomViewModel.h"
@interface FirstVC ()
@property(nonatomic,strong)ViewManager *viewManager;
@property(nonatomic,strong)CustomViewModel *viewModel;
@end
@implementation FirstVC
- (void)viewDidLoad {
[super viewDidLoad];
//讓View的點(diǎn)擊事件交給viewManager
[self.viewManager managerBtnBlockWithView:self.view];
//實(shí)現(xiàn)viewModel 與 View 的綁定
[self.viewModel fetchRequestCustomDataWithModelArray:^(NSMutableArray *array){
self.viewManager.setViewBlock(array);
}];
}
- (ViewManager *)viewManager {
return LB_LAZY(_viewManager, ({
ViewManager *manager = [ViewManager new];
manager;
}));
}
- (CustomViewModel *)viewModel {
return LB_LAZY(_viewModel, ({
CustomViewModel *cVM = [CustomViewModel new];
cVM;
}));
}
2钦铁、ViewModel 處理業(yè)務(wù)邏輯
.h文件
#import <Foundation/Foundation.h>
typedef void(^modelArrayBlock) (NSMutableArray *array);
@interface CustomViewModel : NSObject
- (void)fetchRequestCustomDataWithModelArray:(modelArrayBlock)arrayBlock;
@end
.m文件
@implementation CustomViewModel
- (void)fetchRequestCustomDataWithModelArray:(modelArrayBlock)arrayBlock{
[[ModelHandle new]requestCustomDataWithHandleBlock:^(NSArray *array) {
arrayBlock((NSMutableArray *)array);
}];
}
@end
3、ModelHandle 用來(lái)處理網(wǎng)絡(luò)請(qǐng)求才漆,轉(zhuǎn)化為模型數(shù)據(jù)牛曹,與ViewModel,Model交互醇滥,實(shí)現(xiàn)ViewModel 與 Model 解耦
.h文件
/**
* 處理數(shù)據(jù)黎比,將數(shù)據(jù)轉(zhuǎn)化為模型 --> 提供給viewModel
*
*/
#import <Foundation/Foundation.h>
typedef void(^ModelHandleBlock)(NSArray *array);
@interface ModelHandle : NSObject
//請(qǐng)求數(shù)據(jù)
- (void)requestCustomDataWithHandleBlock:(ModelHandleBlock)handleBlcok;
@end
.m文件
#import "ModelHandle.h"
#import "CustomModel.h"
@interface ModelHandle ()
@property (nonatomic, strong) NSMutableArray *dataArrayList;
@end
@implementation ModelHandle
// 模擬網(wǎng)絡(luò)請(qǐng)求
- (void)requestCustomDataWithHandleBlock:(ModelHandleBlock)handleBlcok {
NSArray *array = @[@{@"name":@"小明",@"age":@"12"}];
for (NSDictionary *dic in array) {
CustomModel *model = [CustomModel new];
[model setValuesForKeysWithDictionary:dic];
[self.dataArrayList addObject:model];
}
handleBlcok(self.dataArrayList);
}
- (NSMutableArray *)dataArrayList {
return LB_LAZY(_dataArrayList, @[].mutableCopy);
}
@end
4、ViewManager 用來(lái)處理View的常規(guī)事件腺办,負(fù)責(zé)管理View
.h 文件
#import <Foundation/Foundation.h>
@class CustomView;
typedef void(^setCustomViewBlock)(NSArray *array);
@interface ViewManager : NSObject
@property (nonatomic,copy)setCustomViewBlock setViewBlock;
@property (nonatomic,weak)CustomView *customView;
- (void)managerBtnBlockWithView:(UIView *)supView;
@end
.m文件
#import "ViewManager.h"
#import "CustomView.h"
@implementation ViewManager
- (void)managerBtnBlockWithView:(UIView *)supView{
LBWeakSelf(self)
[supView addSubview:self.customView];
weakself.customView.btnActBlock = ^(UIButton *sender) {
NSLog(@"%@",sender.currentTitle);
};
weakself.setViewBlock = ^(NSArray *array) {
weakself.customView.setVBlock(array);
};
}
- (CustomView *)customView {
return LB_LAZY(_customView, ({
CustomView *cV = [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:nil options:nil].firstObject;
cV;
}));
}
@end
5焰手、View 用來(lái)呈現(xiàn)用戶界面
.h 文件
#import <UIKit/UIKit.h>
/**
* view的事件 全部交由viewManager 處理
*/
typedef void (^btnIsClicked)(UIButton *sender);
typedef void (^setViews)(NSArray *array);
@interface CustomView : UIView
@property (nonatomic,copy)btnIsClicked btnActBlock;
@property (nonatomic,copy)setViews setVBlock;
@end
.m 文件
#import "CustomView.h"
#import "CustomModel.h"
@interface CustomView ()
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *ageLabel;
@end
@implementation CustomView
- (IBAction)firstBtnAction:(UIButton *)sender {
self.btnActBlock(sender);
}
- (IBAction)sectionBtnAction:(UIButton *)sender {
self.btnActBlock(sender);
}
- (void)awakeFromNib {
[super awakeFromNib];
self.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
LBWeakSelf(self)
self.setVBlock = ^(NSArray *array) {
CustomModel *model = array.firstObject;
weakself.nameLabel.text = model.name;
weakself.ageLabel.text = model.age;
};
}
@end
6、Model 用來(lái)呈現(xiàn)數(shù)據(jù)
.h 文件
#import <Foundation/Foundation.h>
@interface CustomModel : NSObject
//客戶編號(hào)
@property(copy,nonatomic)NSString *name;
//客戶名稱
@property(copy,nonatomic)NSString *age;
@end