原文连接 : 连接git
一个总体的分层? 逻辑清晰? 仍是清晰的分工? 对于架构模式来讲并无一个很是明确的定义, 比较抽象, 在于设计在于架构, 无论是小到类与类之间的交互, 仍是不一样的小模块, 小版块之间, 甚至于在不一样的业务之间, 咱们均可以去从架构的方面去理解, 去分析github
那么咱们平时开发用到的代理, block固然也是起到解耦合, 使代码的耦合度下降, 通知能够解决二者之间的相互引用而且实现解耦合 那么在iOS中常见的架构来讲, 常见有哪些呢? MVC架构, MVP架构, MVVM架构 固然这些架构都有一个共同特色: 解耦合编程
自己来讲View和Model, 可是在实际开发使用的时候, 仍是有联系的, 这个平时开发的比较多, 下图是我简单画的一个关系图, 说明了三者之间的关系 swift
下图画的一个简单的关系图, 那么咱们根据这个简单的关系图用一个简单的demo来演示MVP是怎么进行二者中的关系处理的 面向接口编程 架构
首先要声明, MVP是有Controller的mvvm
_presenter = [[Presenter alloc]init];
_mvpView = [[MVPView alloc]init];
_mvpView.frame = self.view.bounds;
[self.view addSubview:_mvpView];
_mvpModel = [[MVPModel alloc]init];
//model处理---稍后处理
复制代码
@property (nonatomic,copy)NSString *content;
复制代码
- (void)showView: (NSString *)content;
复制代码
@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];
}
复制代码
- (instancetype)init
{
self = [super init];
if (self) {
//此处咱们进行初始化
}
return self;
}
- (void)showView: (NSString *)content{
//方法数据处理, 此处我写的是伪代码和思路
//self.label.text = content;
}
复制代码
_mvpModel.content = @"MVP模式";
// model还没赋值---->此处在view中的是伪代码,只须要在view根据伪代码直接处理
_presenter.model = _mvpModel;
_presenter.view = _mvpView;
[_presenter usageLogic];
复制代码
假如说咱们须要处理点击事件, 那么能够在View中使用代理, 或者block, 以前使用MVC使用C来遵照协议, 那么MVP的话是怎样处理, 在P中来实现的, 逻辑处理是在P中来处理的, 此处MVP中的遵照协议通常状况下写在P中 好了, 给你们这个简单demo, 固然在代码中也写了注释, 能够去个人git下载, 欢迎star 下载连接 : demo地址spa
下图是我简单画的一个关系图, 说明了三者之间的关系 设计
这里咱们也经过一个小Demo来简单理解一下, 不过多的去说绕来绕去的东西, 直接上代码, 在开发中实际应用双向绑定
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架构模式";
复制代码
@property (nonatomic,copy)NSString *content;
复制代码
@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]
}];
复制代码
@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;
}
复制代码
//model处理--稍后处理
self.model = [[MVVMModel alloc]init];
self.model.content = @"MVVM架构模式";
[_viewModel setModel:_model];
[_mvvmview showView:_viewModel];
复制代码
响应式编程 也是由MVC来演变过来的, 和MVC相比的话, 咱们的V取代了C中的业务逻辑处理, ViewModel并非单纯的业务逻辑类, 和咱们的View和Model是相互关联的, 而且进行了双向的绑定 假如说咱们要添加点击事件,咱们能够在ViewModel中来处理点击方法逻辑, 而后在咱们View中导入ViewModel, 在View中点击调用点击方法的具体逻辑就能够了
好了, 给你们这个简单demo, 固然在代码中也写了注释, 能够去个人git下载, 欢迎star 下载连接 : demo地址
技术交流q群150731459