iOS MVC+P+M 個人Note小結

powerx_yc發表於2017-09-07

目的: 簡單 闡述平時在專案中使用MVC MVP MVVM構建專案場景(Scene):

1 舉一例子:如下圖所示,專案中的某一個場景圖。

3634579-7b952b4d3daca4b5.png

該場景中 有兩個場景展示 刪選展示,刪選結果展示;

業務邏輯部分:資料獲取,介面跳轉;

1:採用MVC模式設計:

1.1 構建場景目錄:

Scene:主要用於管理 View的佈局(addUI) 資料獲取(getDataRemote)  和 一些基本配置(configuration)

3634579-4106c36fa11b6e70.png
資料夾目錄

Controlle檔案:構建函式部分採用基本配置:如下圖 提供基本的介面 資料 和建立View

3634579-44cc22180e74b580.png
CollectionViewController

Model檔案,基本的資料轉模型:我這裡面就是一些基本的網路請求下來的key

比如:@property (nonatomic, strong) NSNumber *photopathkey;

@property (nonatomic, strong) NSNumber *iconkey;........;

View檔案:

3634579-ccd78026ad31fbaa.png
cell 暴露set方法為屬性賦值


view 在Controller中賦值如下圖

3634579-eaeab98c7e728b7a.png
在Controller中賦值
3634579-8fda177277adcb12.png
在Controller中賦值

等一下:HTTourViewHelper 是什麼?HTTourViewHelper:是為了View和model 的隔離 做的一個Controller。被分配在controller類中,

3634579-cb7c7358fa4680c5.png
collectionViewCellHepler


3634579-c81af55b535a71b0.png
collectionViewCellHepler 具體實現:

view 和model 完全實現了隔離,view的複用性完全沒問題,現在基本View 和Model  的設定已經完成,接下來只需要在Scene資料夾下,場景中做一些拼盤工作就可以了!

如圖:

3634579-5e633aa4178c1625.png
Scene中的建構函式


3634579-53bac7090414627b.png
HTTourListViewController.m


每個介面做的事情非常簡單;在configuration中

#pragma mark -  設定基本資訊

-(void)configuration{

self.subTourVC = [HTSubTourViewController instanceSubTourView];

}

#pragma mark - UI相關

-(void)addUI{

[self.view addSubview:self.subTourVC.haimaMenu];

[self.view addSubview:self.subTourVC.haimaCollectionView];

}

#pragma mark - 網路相關

-(void)fetchData{

MBProgressHUD *hud = [MBProgressHUD showMessage:@"載入資料中..."];

[self.subTourVC loadHaimaDataWithCountryStr:_areacode sortedStr:_isHot comPletionHandler:^(NSError *error, id result) {

[hud hide:YES];

[self eitherAddNoNetViewWithError:error];

}];

}

-(void)eitherAddNoNetViewWithError:(NSError *)error{

if (error) {

[self.view addSubview:self.noNetView];

}else{

if ([self.view.subviews containsObject:self.noNetView]) {

[self.noNetView removeFromSuperview];

}

}

return;

}

好了,一個業務場景展示完畢;在scene中的程式碼不超過200行;

總結:Scene作為業務場景+需要展示幾種種資料;對應的就有幾個MVC,這幾個MVC負責各自模組的資料獲取,資料處理和資料展示,而SceneVC需要做的就是配置好這幾個個MVC,並在合適的時機通知各自的C層進行資料獲取,各個C層拿到資料之後進行相應處理,處理完成之後渲染到各自的View上,SceneVC最後將已經渲染好的各個View進行佈局即可。

2 MVP:相對於MVC ,MVP做了哪些工作呢?

2.1 相對於MVC中V 和 M 個高度隔離,MVP 中,V 層 C 層不在處理任何業務邏輯,所有事件觸發全部呼叫P層的相應命令,而C層做的事情就是佈局和PV之間的繫結。即分割業務展示 和業務邏輯,展示和邏輯分開後,V收到的通知騎士都是來自於P層的資料獲取/更新操作,所以只需要保證P層的這些操作都是正常的就可以了,只用測試P 層的資料獲取、更新操作邏輯,不必關心V層的情況;

2.2 比較下

MVC

1 程式碼複用:三個小模組的V(Cell)對外只暴露Set方法,對M甚至C都是隔離的狀態,

複用沒有問題;

2 程式碼臃腫:因為Scene大部分的邏輯和佈局都轉移到了響應的MVC中,拼裝MVC的便利建構函式便構建了兩個不同的業務場景;

3 易擴充套件性:無論產品未來是想要加回收站還是防禦塔,搭建相應的MVC模組,加到對應的scene中即可;

4 可維護性:各個模組間職責分離。

5 易測試性:業務的初始化依然繫結在scene的生命週期中,而有些邏輯也依然需要UI的點選事件觸發。

缺點:過度的注重隔離:為了實現V層的完全隔離,V只對外提供Set方法;

業務邏輯和業務展示強耦合;(如頁面跳轉、點贊、分享。。。)是直接散落在V層。

這是不合理的,因為業務邏輯最終改變的是資料M--------而不是展示M的V;

MVP針對以上缺點做了優化,它將業務邏輯和業務展示也做了一層隔離;

MVCP :M和V功能不變,原來的C現在只負責佈局,而所有的邏輯全部都轉移到P層;

如圖:


3634579-9001bc8373260352.png
P層cell邏輯
3634579-56074e0348bc2daf.png
P層Cell的邏輯

而P層CollectionViewCell 的邏輯:仍是將 loadData  和一些基本資料處理的方法移到P層做處理,不作贅述。

3: MVVM: M(model) V(view + controller) VM(View Model資料模型);

ViewModel:基本資料都轉移到此,在明瞭邏輯處理時,就可以先行做這塊的事情;

M:不變;

V:包括V 和Controller。

提到MVVM ,相信很多人都會想到ReactiveCocoa(FRP框架)! 也是的,不過ReactiveCocoa並不是MVVM模式的唯一方式,不過它提供了一種非常優雅的方式,寫的每一行程式碼幾乎都是在響應某個事件,例如按鈕的點選,收到網路訊息,屬性的變化(通過KVO)或者使用者位置的變化(通過CoreLocation)。但是這些事件都用不同的方式來處理,比如action、delegate、KVO、callback等。ReactiveCocoa為事件定義了一個標準介面,從而可以使用一些基本工具來更容易的連線、過濾和組合。(定義:注意這個詞,是定義)。好用,非常好用(訊號-訂閱),精簡程式碼(需要使用例項變數來追蹤瞬時狀態。),邏輯清晰(block 呼叫).........總之就是能學就學。非常好用

相關文章