可以先看看這個Demohttps://github.com/ming1016/DecoupleDemo罚拟。從這個Demo里可以看到Controller和View還有Store的頭文件里沒有任何Delegate亿卤,Block回調(diào),只有初始化和更新ViewModel的方法热凹。所有這些控件泵喘,請求,ViewController和視圖之間的聯(lián)系都是通過ViewModel來進(jìn)行的般妙,而viewModel也不進(jìn)行任何邏輯處理纪铺,只是簡單的起到描述和默認(rèn)值設(shè)置的作用。ViewController也被減輕的小得不能再小了碟渺,只需要初始化視圖和Store即可鲜锚。這也是我的一次嘗試,看看如何利用KVO能夠做到最大限度的解耦止状,和最大限度的減少代碼和接口烹棉。
可以先看看以前代碼最臃腫的地方在使用了新的思路后會變成怎么樣,首先是ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self addKVO];
[self buildConstraints];
self.tbStore = [[TestTableStore alloc] initWithViewModel:self.tbView.viewModel];
}
可以看到里面僅僅做了添加KVO怯疤,布局控件和初始化Store的工作。
封裝的TableView作為一個通用控件是不會去設(shè)置管理不同的Cell的催束,可以看看不用Delegate和Block是如何處理的集峦。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
self.viewModel.tableViewIdentifier = smTableViewIdentifier;
self.viewModel.tableView = tableView;
self.viewModel.cellIndexPath = indexPath;
return self.viewModel.cell;
}
我覺得這樣應(yīng)該很簡化了。當(dāng)觸發(fā)到UITableView這個配置Cell的回調(diào)時,通過對ViewModel的鍵值的監(jiān)聽就能夠在任何地方對Cell進(jìn)行配置了塔淤,而不用通過繁瑣的Delegate和Block來層層回調(diào)了摘昌。
除了這里外,其它地方也用同樣的方法進(jìn)行了處理高蜂,比如說對新出現(xiàn)消息提示點(diǎn)擊使其消失只需要設(shè)置ViewModel里的isHideHintView的值的處理聪黎,還有對請求不同狀態(tài)顯示不同引導(dǎo)頁,只要是以前需要通過接口和回調(diào)的全部干掉备恤,用ViewModel去控制稿饰,下面可以看看我寫的ViewModel中,我將KVO分成了View Side和Data Side露泊,前者主要是響應(yīng)視圖方面的邏輯變化喉镰,后者Data Side是響應(yīng)不同的動作來產(chǎn)生對數(shù)據(jù)不同的處理,其它就都是些關(guān)于樣式和數(shù)據(jù)配置相關(guān)的了惭笑。
//---------------------------
// KVO View Side
//---------------------------
@property (nonatomic, assign) BOOL isHideGuideView; //是否顯示guide view
@property (nonatomic, assign) BOOL isHideHintView; //是否顯示hint view
//下拉刷新上拉加載更多
@property (nonatomic, assign) SMTableRequestStatus requestStatus; //刷新狀態(tài)
//TableView Delegate
//通用
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSString *tableViewIdentifier;
//Cell
@property (nonatomic, strong) NSIndexPath *cellIndexPath;
@property (nonatomic, strong) UITableViewCell *cell;
//CellHeight
@property (nonatomic, strong) NSIndexPath *cellHeightIndexPath;
@property (nonatomic, assign) CGFloat cellHeight;
//---------------------------
// KVO Data Side
//---------------------------
@property (nonatomic, assign) SMTableRefreshingStatus dataSourceRefreshingStatus; //請求狀態(tài)
縱觀整個項(xiàng)目侣姆,頭文件都很干凈,唯一有方法需要參數(shù)的也就是ViewModel沉噩。這種完全面向?qū)ο笏悸返木幊谭绞皆谛枨蠼?jīng)常變更的情況下優(yōu)勢就會慢慢顯露出來捺宗,對吧。