ios MVVM使用

hither發表於2017-12-13

最近發現自己的專案裡C層的程式碼越來越多,即便把資料來源和各種代理分離出去,也是多。就開始用MVVM來組織我的專案。下面是我找的一個demo我在他的基礎上進行了修改下,公司的專案就不拿出來看了,嘿嘿?,都是基於MVVM進行組織的。?

  • 我的專案結構:
    ios    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.

ios    MVVM使用

記得設定StroyBoard ID 和Class

ios    MVVM使用

ios    MVVM使用

記得設定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地址:

老版本 ---> MVVM_ONE

優化版 ---> MVVM_TWO

相關文章