iOS 架構模式

架構模式

原文連接 : 連接git

一個總體的分層? 邏輯清晰? 仍是清晰的分工? 對於架構模式來講並無一個很是明確的定義, 比較抽象, 在於設計在於架構, 無論是小到類與類之間的交互, 仍是不一樣的小模塊, 小版塊之間, 甚至於在不一樣的業務之間, 咱們均可以去從架構的方面去理解, 去分析github

基本的架構基礎

那麼咱們平時開發用到的代理, block固然也是起到解耦合, 使代碼的耦合度下降, 通知能夠解決二者之間的相互引用而且實現解耦合 那麼在iOS中常見的架構來講, 常見有哪些呢? MVC架構, MVP架構, MVVM架構 固然這些架構都有一個共同特色: 解耦合編程

MVC

自己來講View和Model, 可是在實際開發使用的時候, 仍是有聯繫的, 這個平時開發的比較多, 下圖是我簡單畫的一個關係圖, 說明了三者之間的關係 swift

MVP

下圖畫的一個簡單的關係圖, 那麼咱們根據這個簡單的關係圖用一個簡單的demo來演示MVP是怎麼進行二者中的關係處理的 面向接口編程 架構

Demo解析

首先要聲明, MVP是有Controller的mvvm

  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;
複製代碼

實現, 那麼咱們在這裏進行一個數據的中間處理atom

- (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地址spa

MVVM

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

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

相關文章
相關標籤/搜索