iOS MVC+P+M 個人Note小結
目的: 簡單 闡述平時在專案中使用MVC MVP MVVM構建專案場景(Scene):
1 舉一例子:如下圖所示,專案中的某一個場景圖。

該場景中 有兩個場景展示 刪選展示,刪選結果展示;
業務邏輯部分:資料獲取,介面跳轉;
1:採用MVC模式設計:
1.1 構建場景目錄:
Scene:主要用於管理 View的佈局(addUI) 資料獲取(getDataRemote) 和 一些基本配置(configuration)

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

Model檔案,基本的資料轉模型:我這裡面就是一些基本的網路請求下來的key
比如:@property (nonatomic, strong) NSNumber *photopathkey;
@property (nonatomic, strong) NSNumber *iconkey;........;
View檔案:

view 在Controller中賦值如下圖


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


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


每個介面做的事情非常簡單;在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層;
如圖:


而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 呼叫).........總之就是能學就學。非常好用
相關文章
- iOS 小坑總結iOS
- iOS'Dev的2018年個人總結 | 掘金年度徵文iOSdev
- 小學期第一週個人總結
- iOS拍個小視訊iOS
- iOS之BLE藍芽SDK開發個人總結(進階篇)iOS藍芽
- iOS之BLE藍芽SDK開發個人總結(基礎篇)iOS藍芽
- 個人總結
- iOS小數四捨五入總結iOS
- gulp個人總結
- iOS開發基礎篇--NSNotificationCenter使用小結iOS
- 2018年個人總結
- SpringBoot的個人總結Spring Boot
- activeMQ個人理解總結MQ
- 2023年個人總結
- 【個人總結】常用技巧
- 爬蟲個人總結爬蟲
- Pycharm 個人安裝小記錄PyCharm
- win10個人收集小技巧Win10
- iOS開發UI篇--仿射變(CGAffineTransform)使用小結iOSUIORM
- 閒來無事,做了個抽紙條的小程式,結果沒人用、、、、、
- Laravel – Artisan 個人常用總結Laravel
- 個人技術棧總結
- 個人吐血系列-總結MybatisMyBatis
- 2021我的個人總結
- 個人總結-CPU快取快取
- 如何在App里拉起一個小程式?(IOS篇)APPiOS
- iOS13 適配和Xcode11.0踩坑小結iOSXCode
- 魅族Note8支援人臉識別解鎖嗎?魅族Note8人臉解鎖設定教程
- 一個iOS個人開發者和他的模擬經營夢iOS
- Element-UI個人使用總結UI
- 2017年前端工作小結,個人踩坑之旅,前端學習者的雜談前端
- 2018年前端工作小結,個人改變之旅,前端學習者的雜談前端
- 智慧機器人 -- Socket.IO應用小結機器人
- ios和android內嵌h5頁面聯調小結iOSAndroidH5
- Flutter 1.12 個人練手學習小案例Flutter
- 武漢遊戲人的350個小時遊戲
- 個人收款之微信小微商戶
- 前端進階-個人筆記-小知識前端筆記
- 開發微信小程式的個人感想微信小程式