最近發現自己的專案裡C層的程式碼越來越多,即便把資料來源和各種代理分離出去,也是多。就開始用MVVM來組織我的專案。下面是我找的一個demo我在他的基礎上進行了修改下,公司的專案就不拿出來看了,嘿嘿?,都是基於MVVM進行組織的。?
- 我的專案結構:
在ViewModel裡面有兩個類。
第一個ViewModel:
//獲取網路的連結狀態
-(void) netWorkStateWithNetConnectBlock: (NetWorkBlock) netConnectBlock WithURlStr: (NSString *) strURl;
// 傳入互動的Block塊
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
WithErrorBlock: (ErrorCodeBlock) errorBlock
WithFailureBlock: (FailureBlock) failureBlock;
複製程式碼
第二個ViewModel:
//跳轉到微博詳情頁
-(void) weiboDetailWithPublicModel: (WBDataUser *) publicModel WithViewController: (UIViewController *)superController;
//tableView重新整理的網路請求
-(void)RefreshRequestWithCallback:(callback)callback isHead:(BOOL)result;
複製程式碼
重點講講跳轉和重新整理: (1)跳轉:
#pragma 跳轉到詳情頁面,如需網路請求的,可在此方法中新增相應的網路請求
-(void) weiboDetailWithPublicModel:(WBDataUser *)publicModel WithViewController:(UIViewController *)superController
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
PublicDetailViewController *detailController = [storyboard instantiateViewControllerWithIdentifier:@"PublicDetailViewController"];
detailController.publicModel = publicModel;
[superController.navigationController pushViewController:detailController animated:YES];
}
複製程式碼
這個是直接使用StroyBoard搭建的介面: ##注意兩個地方: 1.
記得設定StroyBoard ID 和Class
記得設定Cell的Class 和Identifier 以及Accessory
(2)重新整理:
在ViewModel裡:
-(void)RefreshRequestWithCallback:(callback)callback isHead:(BOOL)result{
if (result) {
_page = 1;
}else{
if (_page < 2) {
_page = 2;
}
}
[HJTNetTool get:[NSString stringWithFormat:@"%@?access_token=%@&count=100",GetData,ACCESSTOKEN] progress:^(NSProgress * _Nonnull progress) {
} success:^(id _Nonnull responseObject) {
_model = [[WBDataWBData alloc]initWithDictionary:responseObject];
if (_model.statuses) {
NSMutableArray *dataArray=[NSMutableArray array];
if (result) {
[dataArray removeAllObjects];
}else{
_page ++;
}
for (WBDataStatuses* statues in _model.statuses) {
[dataArray addObject:statues.user];
}
callback(dataArray);
}
} failure:^(NSString * _Nonnull errorLD) {
SHOW_NTERROR
}];
}
複製程式碼
使用的VC中:
//下拉載入
-(void)loadNewData{
[tableViewModel RefreshRequestWithCallback:^(NSArray *array) {
_publicModelArray = [array mutableCopy];
[self.tableView.mj_header endRefreshing];
[self.tableView reloadData];
} isHead:YES];
}
//上拉載入更多
-(void)loadMoredata{
[tableViewModel RefreshRequestWithCallback:^(NSArray *array) {
_publicModelArray = [array mutableCopy];
[self.tableView.mj_footer endRefreshing];
[self.tableView reloadData];
} isHead:NO];
}
複製程式碼
MVVM相比MVC,把邏輯處理和網路請求都放到了ViewModel這個類中進行,比起簡簡單單的分離資料來源和代理,C層變得更加易於維護。
Demo地址: