說到iOS的框架工秩,可能很多人都在使用MVC金闽,Model-View-Controller条摸,這種模式下對(duì)于業(yè)務(wù)的處理就會(huì)全部集中到控制器里面去處理,在稍微復(fù)雜的頁面中覆旭,Controller會(huì)變得非常的臃腫退子,難以測(cè)試,當(dāng)然對(duì)于后期的維護(hù)來說也是一種災(zāi)難型将。MVVM是一種Model-View-ViewModel的模式寂祥,是基于MVC的一種框架,因此它是兼容MVC的七兜。同時(shí)丸凭,它把對(duì)業(yè)務(wù)的處理提取出來,放到了ViewModel中來處理腕铸,因此惜犀,控制器不用管這些復(fù)雜的邏輯處理,我們只要把處理結(jié)果給Controller就可以了狠裹。
比如說虽界,我們要從網(wǎng)絡(luò)接口請(qǐng)求數(shù)據(jù),在MVC里面涛菠,我們要在Controller里面調(diào)用網(wǎng)絡(luò)請(qǐng)求類莉御,返回?cái)?shù)據(jù)撇吞,然后轉(zhuǎn)模型,在展示數(shù)據(jù)礁叔。而在MVVM中牍颈,我們把這件事件交給ViewModel來做,只需要把序列化的數(shù)據(jù)返回給Controller晴圾,而Controller根本就不用管數(shù)據(jù)是怎么請(qǐng)求的颂砸,怎么序列化的,這些中間過程Controller都不用管死姚,這樣就簡化Controller的工作量人乓,模塊化了功能,測(cè)試起來更加的簡單和準(zhǔn)確都毒。 當(dāng)然色罚,MVVM也有自身的缺陷,就是會(huì)增加很多的類账劲,尤其是對(duì)于那些簡單的邏輯處理戳护,這樣封裝的話反而會(huì)顯得比較的拖沓。所以對(duì)于MVVM框架的使用瀑焦,還是要看具體的情況來判斷腌且。
比如說我們?cè)谥黜撘@示一個(gè)列表,要請(qǐng)求數(shù)據(jù)榛瓮,我只用實(shí)例化一個(gè)ViewModel铺董,然后調(diào)用它的方法就可以了
- (void)getDataFormNetwork {
// 從網(wǎng)絡(luò)加載數(shù)據(jù)
JTMainViewModel *mainViewModel = [[JTMainViewModel alloc] init];
mainViewModel.URL = @"http://***************";
mainViewModel.parameters = nil;
[SVProgressHUD showWithStatus:@"加載中..."];
[mainViewModel requestDataSourceWithSuccess:^(id _Nullable responseObject) {
[SVProgressHUD dismiss];
NSArray *list = (NSArray *)responseObject;
self.dataSource = list;
[self.tableView reloadData];
// 保存到數(shù)據(jù)庫
[self saveToDatabase:list];
} fail:^(NSError * _Nullable error) {
[SVProgressHUD dismiss];
JTLOG(@"error = %@", error);
[self getDataFormDatabase];
} noNetwork:^(BOOL status) {
if (!status) {
[SVProgressHUD showErrorWithStatus:@"網(wǎng)絡(luò)錯(cuò)誤"];
[self getDataFormDatabase];
}
}];
}
網(wǎng)絡(luò)數(shù)據(jù)加載失敗或者沒有聯(lián)網(wǎng)時(shí),直接調(diào)用它對(duì)應(yīng)的方法禀晓,拿到數(shù)據(jù)
// 從數(shù)據(jù)庫加載數(shù)據(jù)
- (void)getDataFormDatabase {
JTMainViewModel *mainViewModel = [[JTMainViewModel alloc] init];
[mainViewModel getDatabaseWithName:@"t_main" keyword:@"*" condition:@"" complection:^(id _Nullable responesObject, NSError * _Nullable error) {
if (!error) {
NSArray *array = (NSArray *)responesObject;
if (array.count > 0) {
self.dataSource = array;
[self.tableView reloadData];
} else {
JTLOG(@"數(shù)據(jù)庫沒有數(shù)據(jù)");
}
}
else {
JTLOG(@"查詢失敗");
}
}];
}
而控制器要做的事情就十分的簡單了精续,只需要刷新界面,展示數(shù)據(jù)粹懒。
總結(jié)重付,MVVM框架是基于MVC的,所以對(duì)MVC是兼容的凫乖,理解起來也很容易确垫。它大大的減少了控制器的工作量,模塊化了功能帽芽,使我們的Controller看起來十分簡潔而高效删掀。
最后附上我Demo的地址:JTConstructForIOS
~end