iOS 架構模式<demo解析>

吃粑粑的畢教授發表於2017-12-14

架構模式

原文連結 : 連結

一個整體的分層? 邏輯清晰? 還是清晰的分工? 對於架構模式來說並沒有一個非常明確的定義, 比較抽象, 在於設計在於架構, 不管是小到類與類之間的互動, 還是不同的小模組, 小版塊之間, 甚至於在不同的業務之間, 我們都可以去從架構的方面去理解, 去分析

基本的架構基礎

那麼我們平時開發用到的代理, block當然也是起到解耦合, 使程式碼的耦合度降低, 通知可以解決兩者之間的相互引用並且實現解耦合 那麼在iOS中常見的架構來說, 常見有哪些呢? MVC架構, MVP架構, MVVM架構 當然這些架構都有一個共同特點: 解耦合

MVC

本身來說View和Model, 但是在實際開發使用的時候, 還是有聯絡的, 這個平時開發的比較多, 下圖是我簡單畫的一個關係圖, 說明了三者之間的關係

iOS 架構模式<demo解析>

MVP

下圖畫的一個簡單的關係圖, 那麼我們根據這個簡單的關係圖用一個簡單的demo來演示MVP是怎麼進行兩者中的關係處理的 面向介面程式設計

iOS 架構模式<demo解析>

Demo解析

首先要宣告, MVP是有Controller的

  1. 首先我們來建立幾個類, Presenter類, MVPView類, MVPModel類
  2. 在Controller匯入類, 初始化
_presenter = [[Presenter alloc]init];
_mvpView = [[MVPView alloc]init];
_mvpView.frame = self.view.bounds;
[self.view addSubview:_mvpView];
_mvpModel = [[MVPModel alloc]init];
//model處理---稍後處理
複製程式碼
  1. 在MVPModel中定義屬性
@property (nonatomic,copy)NSString *content;
複製程式碼
  1. 在MVPView並不可以提取資料, 因為在MVP模式中我們的V和M是沒有直接聯絡的, 所以這裡我們提供一個方法, 給我們的Presenter類
- (void)showView: (NSString *)content;
複製程式碼
  1. 此時我們來處理Presenter, 在Presenter類中宣告model和view屬性, 並且來增加一個方法 宣告
@property (nonatomic,strong)MVPModel *model;
@property (nonatomic,strong)MVPView *view;
- (void)usageLogic;
複製程式碼

實現, 那麼我們在這裡進行一個資料的中間處理

- (void)usageLogic{
NSString *content = self.model.content;
//通過Presenter將model賦值
[self.view showView:content];
}
複製程式碼
  1. 在MVPView類處理view的UI
- (instancetype)init
{
self = [super init];
if (self) {
//此處我們進行初始化
}
return self;
}
- (void)showView: (NSString *)content{
//方法資料處理, 此處我寫的是虛擬碼和思路
//self.label.text = content;

}
複製程式碼
  1. 在Controller中處理未處理的model賦值處理
_mvpModel.content = @"MVP模式";
// model還沒賦值---->此處在view中的是虛擬碼,只需要在view根據虛擬碼直接處理
_presenter.model = _mvpModel;
_presenter.view = _mvpView;
[_presenter usageLogic];
複製程式碼

MVP總結

假如說我們需要處理點選事件, 那麼可以在View中使用代理, 或者block, 之前使用MVC使用C來遵守協議, 那麼MVP的話是怎樣處理, 在P中來實現的, 邏輯處理是在P中來處理的, 此處MVP中的遵守協議一般情況下寫在P中 好了, 給大家這個簡單demo, 當然在程式碼中也寫了註釋, 可以去我的git下載, 歡迎star 下載連結 : demo地址

MVVM

下圖是我簡單畫的一個關係圖, 說明了三者之間的關係

iOS 架構模式<demo解析>

Demo解析

這裡我們也通過一個小Demo來簡單理解一下, 不過多的去說繞來繞去的東西, 直接上程式碼, 在開發中實際應用

  1. 首先我們來建立幾個類, MVVMModel類, MVVMView類, MVVMViewModel類
  2. 在Controller匯入類, 初始化
self.mvvmview = [[MVVMView alloc]init];
self.viewModel = [[MVVMViewModel alloc]init];
self.mvvmview.frame = self.view.bounds;
[self.view addSubview:self.mvvmview];
//model處理--稍後處理
self.model = [[MVVMModel alloc]init];
self.model.content = @"MVVM架構模式";
複製程式碼
  1. 在MVVMModel中定義屬性
@property (nonatomic,copy)NSString *content;
複製程式碼
  1. 在MVVMView並中定義viewModel屬性 宣告
@property (nonatomic, strong) MVVMViewModel *vm;

- (void)showView:(MVVMViewModel *)viewModel;
複製程式碼

實現, 傳入

//實現
[self.KVOController observe:viewModel keyPath:@"contentStr" options:NSKeyValueObservingOptionInitial||NSKeyValueObservingOptionNew block:^(id  _Nullable observer, id  _Nonnull object, NSDictionary<NSKeyValueChangeKey,id> * _Nonnull change) {
//此處使用的是虛擬碼
//實現雙向繫結
//_label.text = change[NSKeyValueChangeNewKey]
}];
複製程式碼
  1. 此時我們來處理MVVMViewModel, 在MVVMViewModel類中中介字元, 並且來增加一個方法 宣告
@property (nonatomic,copy)NSString *contentStr;
@property (nonatomic,strong)MVVMModel *model;
- (void)setWithModel:(MVVMModel *)model;
複製程式碼

實現, 那麼我們在這裡進行一個資料的中間處理

- (void)setWithModel:(MVVMModel *)model{
self.model = model;
self.contentStr = self.model.content;
}

複製程式碼
  1. 在Controller中處理未處理的model賦值處理
//model處理--稍後處理
self.model = [[MVVMModel alloc]init];
self.model.content = @"MVVM架構模式";
[_viewModel setModel:_model];
[_mvvmview showView:_viewModel];
複製程式碼

MVVM總結

響應式程式設計 也是由MVC來演變過來的, 和MVC相比的話, 我們的V取代了C中的業務邏輯處理, ViewModel並不是單純的業務邏輯類, 和我們的View和Model是相互關聯的, 並且進行了雙向的繫結 假如說我們要新增點選事件,我們可以在ViewModel中來處理點選方法邏輯, 然後在我們View中匯入ViewModel, 在View中點選呼叫點選方法的具體邏輯就可以了

好了, 給大家這個簡單demo, 當然在程式碼中也寫了註釋, 可以去我的git下載, 歡迎star 下載連結 : demo地址

技術交流q群150731459

相關文章