一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
前言
苹果官方推荐的 APP 架构是 MVC 架构,后面所有的 MVP、MVVM 和 VIPER 架构都是基于 ViewController 的。
都试图将“视图控制器”拆分成更多的层级
MVC思想:视图不依赖于具体的数据类型,而是依赖于遵守特定协议的数据源,M 和V 是不存在依赖关系。
-
比如UIKit 中的UItableview一样,什么样的数据M,UItableview都可以展示,只要M遵守实现了UITableViewDataSource协议。
-
本文的例子: M遵守的数据源协议: DKHomeDropdownViewDataSource V:DKHomeDropdownView.h 具体看本文的附
I、V 对数据源M使用协议进行规范
1.1 MVC思想
视图不依赖于具体的数据类型,而是依赖于遵守特定协议的数据源。
视图的数据直接向数据源对象请求,而不是从自身属性获取。`
1、 M 和V 是不存在依赖关系。就行UIKit 中的UItableview一样,什么样的数据M都可以展示。 2、 V 提供一套数据源协议(代理),向外界索要数据。即向数据源对象增加一套统一的协议方法,来规范数据源对象 3、controller: 负责资源的调度,任务分配
1.2 例子
在app 中要实现两个样式一样,展示的数据不一样的下拉菜单。此时为了代码的抽取,利用MVC思想进行实现。
分析: 1、首页的下拉菜单,由两个tableview组成,即 主表和从表。因此采用两个UITableView实现。因此需要对主从表展示的数据进行约束抽象出DKHomeDropdownViewData 协议。
2、在自定义视图下拉菜单DKHomeDropdownView 实现的UITableView 协议方法中分别处理主从数据,而数据直接向数据源对象请求。因此下拉菜单需要DKHomeDropdownViewDataSource 协议属性。 3、DKHomeDropdownView 内部发生了选择事件的时候,需要通知外围的控制器,因此需要DKHomeDropdownViewDelegate代理属性。
DKHomeDropdownView 的头文件请见附。 DKHomeDropdownView 的实现细节请参考DKMeituanHD。
1.3 DKHomeDropdownView
//
// DKHomeDropdownView.h
// DKMeituanHD
//
// Created by devzkn on 07/01/2017.
// Copyright © 2017 hisun. All rights reserved.
//
#import <UIKit/UIKit.h>
@class DKHomeDropdownView;
@protocol DKHomeDropdownViewDelegate <NSObject>
@optional
- (void)homeDropdownView:(DKHomeDropdownView*)homeDropdownView didSelectedRowsInMainTable:(NSInteger)row;
- (void)homeDropdownView:(DKHomeDropdownView*)homeDropdownView didSelectedRowsInSubTable:(NSInteger)row inMainTable:(NSInteger)mainRow;;
@end
@protocol DKHomeDropdownViewData <NSObject>
@required
- (NSString*) title;
- (NSArray*)subdata;
@optional
- (NSString*)icon;
- (NSString*)selectedIcon;
@end
@protocol DKHomeDropdownViewDataSource <NSObject>
@required
/**
左边的表格一共有多少行。
@param homeDropdownView 下拉菜单
@return 行数
*/
- (NSInteger)numberOfRowsInMainTableDKHomeDropdownView:(DKHomeDropdownView*)homeDropdownView;
- (id<DKHomeDropdownViewData>) homeDropdownView:(DKHomeDropdownView*)homeDropdownView subdataForRowsInMainTable:(NSInteger)row;
@end
/**
*首页的下拉菜单,由两个tableview组成
*/
@interface DKHomeDropdownView : UIView
/**
*真正的MVC思想:
M 和V 是不存在依赖关系。就行UIKit 中的UItableview一样,什么样的数据M都可以展示。
V 提供一套数据源协议(代理),向外界索要数据。即向数据源对象增加一套统一的协议方法,来规范数据源对象
ps: 而非容易想到的,将数据通过属性直接提供给V。这样会导致数据源的单一性
*/
@property (nonatomic,assign) id<DKHomeDropdownViewDataSource> dataSource;
@property (nonatomic,assign) id<DKHomeDropdownViewDelegate> delegate;
+ (instancetype) homeDropdownView;
- (void) reloadData;
@end
II、VIPER 架构
-
V - View,视图/视图控制器。
-
I - Interactor,反应器。
负责对数据的访问和处理,也就是业务逻辑。 是 VIPER 中的引擎,它会和 Presenter、Entity 构成双向绑定。APP 的动态逻辑主要是放在 Interactor 中的,比如数据的获取,比如数据改变后的 UI 刷新。如果数据的获取是来自于数据库或网络,那么 Interactor 中可以划分出单独的数据访问层(DAO)
- P - Presenter,呈现器。
负责视图控制器的渲染,比如将数据展现到每个控件。以及单数据被改变后 UI 的刷新。 Presenter 呈现器是中枢神经,因为整个 VIPER 链都要通过它串联起来,比如说 View 和 Interactor 都会和它进行双向绑定,即互相引用。
- E - Entity,实体。
对应了 MVC 中的模型层。
- R - Router,路由器。
负责视图控制器相关的导航(即 Segue),包括进来的导航和出去的导航。 Router是入口:View/ViewController 由路由器创建,其它组件也是由路由器中创建并组装成整个 VIPER 链的。
III、MVVM
实践 MVVM 的关键点在于,我们要能够分析清楚 viewModel 需要暴露给 view 的数据和命令,这些数据和命令能够代表 view 当前的状态。
在 MVVM 中,视图状态和 ViewModel 双向绑定
iOS进阶:MVVM数据绑定的实现方式(KVO、block、Delegate、Notification、RAC)
blog.csdn.net/z929118967/… 在 iOS 的 MVVM 实现中,我们可以使用 RAC 来在 view 和 viewModel 之间充当 binder 的角色,优雅地实现两者之间的同步。此外,我们还可以把 RAC 用在 model 层,使用 Signal 来代表异步的数据获取操作,比如读取文件、访问数据库和网络请求等。
———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…
see also
🍅 联系作者: iOS逆向(公号:iosrev)
🍅 作者简介:CSDN 博客专家认证🏆丨全站 Top 50、华为云云享专家认证🏆、iOS逆向公号号主
🍅 简历模板、技术互助。关注我,都给你。