-
Notifications
You must be signed in to change notification settings - Fork 61
1. Getting Started (快速开始)
Welcome to XFLegoVIPER!
This is a guide to help developers get up to speed with XFLegoVIPER. It is geared primarily towards anyone who is know VIPER design pattren. XFLegoVIPER is based on a modular, and partially support URL route architecture, allowing route a VIPER module as well as ViewController.
注意:XFLegoVIPER框架的中文名为
乐高
。
在开始构建一个模块前,我们先约定好一些规范,这样就可以快速创建一个模块,并可以自动加载到框架的运行容器。
-
在乐高世界里把VIPER的模块名和MVx的控制器名统称为组件名,如:在VIPER模块里BDJLoginRouting、BDJLoginPresenter等层的组件名为Login,同一个模块的各层组件名一定要相同,在MVx模式里BDJLoginViewController的组件名为Login。
-
每一个类都应该有前辍名和后辍,如:在VIPER模块里BDJLoginRouting、BDJLoginPresenter的前缀为BDJ,后辍名为分别为Routing、Presenter,在MVx里BDJLoginViewController的前缀是BDJ,后辍名是ViewController。
在使用乐高作为项目的驱动引擎时,类前辍不可以省略,这也使用OC编程的好的风格。后辍名诸如Activity、Routing、Presenter是VIPER模块对各层的称名,以方便内部解析引擎对当前模块的自动构建,在MVx里控制器必需以ViewController作为后辍名,这样框架才能把它归为组件类型。
-
模块化是把项目功能划分出一个个模块,想要解决模块之间的耦合就要通过组件化方式,以组件的方式把一个一个模块隔离开来。
一个模块可以是一个组件,一个控制器也是一个组件,对于组件来说一个可插件的东西就是组件,而这个插件的丢失不会影响整个系统的运行。乐高提供VIPER模块化用来细分功能代码,同时提供了组件化用来串起VIPER模块和旧项目的控制器,以统一跳转的API来处理不同的组件。
-
一个基于VIPER的模块必需拥有:视图层(Activity)、事件层(Presenter)、路由层(Routing),由于在乐高内部对视图层是弱引用,而它们关系引用是Activity->Presenter->Routing,所以一个模块的的存在是由视图层决定。如果没有事件层,模块事件就无法传递,那这个模块也不会加入到乐高框架的运行容器。如果路由层没有就不能称为一个模块了,因为在乐高的世界里,一个路由就代表一个模块,它拥有当前模块的三大功能:多功能模块组装器、UI总线、事件总线。
-
-
视图层(Activity):子视图绘制、布局、动画,绑定事件层
-
事件层(Presenter):视图渲染数据填充、UI事件、模块事件消息处理,数据请求
-
路由层(Routing):模块组装与跳转
-
业务层(Interactor):模型数据获取、业务处理
-
数据管理层(DataManager):提供数据来源(远程、本地<缓存文件、数据库>)、数据类型匹配与整理
-
-
个别名称不同的层与乐高对应如下:
- View -> Activity
- Wireframe -> Routing (原VIPER设计模式中,Wireframe与Routing通用)
- Data Store -> DataManager
-
由于图显示出错,略!
-
宏即预处理指令,用于解决重复的代码,屏蔽背后复杂的API,如:
XF_AutoAssemblyModule_Fast
一个用于快速组装模块的宏。它极大的简化了API的复杂度和代码行数,同时又能屏蔽背后API被升级时修改或废弃的带来风险,所以强烈推荐优先使用模块各层提供的宏编写代码。注意:
- 有关于数据绑定的宏需要联合
ReactiveCocoa
响应函数式编程库的支持,如要使用XF_C_
、XF_$_
、XF_CEXE_
、XF_CEXE_Enable_
宏时需要加入ReactiveCocoa
库。 - 另外还一个要注意的是,一些宏包含的多行代码且不是单独一个方法时会对断点调试会有影响!!如:
XF_$_
、XF_CEXE_
、XF_CEXE_Enable_
、XF_EventIs_
、XF_ShowURLComponent2Window_
等,对于需要调试的代码段,可以把它们封装进一个单独方法里。
- 有关于数据绑定的宏需要联合
-
分别创建模块层继承自:XFActivity、XFPresenter、XFRouting、XFInteractor、XFDataManager。
创建它们的层接口继承自:XFUserInterfacePort、 XFEventHandlerPort 、 XFWireFramePort 、 XFInteractorPort 、 XFDataManagerPort 。
乐高框架起始目的是快速编写基于VIPER设计模式的代码,所以在名层头文件都提供了常用功能的宏,下面的宏是至今最快的模块组装方式:
#import "BDJIndexTabRouting.h"
@implementation BDJIndexTabRouting
// 组装模块
XF_AutoAssemblyModule_Fast
@end
-
只要符合组件的命名规范,就可以使用下面的方式:
#import "BDJPostRouting.h"
@implementation BDJPostRouting
// 组装模块
XF_AutoAssemblyModule_Fast
// 跳转组件
- (void)transition2PostComment
{
// 由于是组件名,所以首字母要大写!!
XF_PUSH_Component_Fast(@"PostComment")
}
@end
-
使用URL组件方式,要先注册:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 这些注册的URL协议名可自定义(如:abc://),它的后面路径名为组件名(组件名是模块名和控制器名的统称)
[XFURLRoute initURLGroup:@[
@"bdj://indexTab", // Tab主UI框架页
@"bdj://essence/post", // 帖子
@"bdj://essence/post/postComment", // 帖子评论
]];
// other code...
return YES;
}
然后在路由中跳转:
#import "BDJPostRouting.h"
@implementation BDJPostRouting
// 组装模块
XF_AutoAssemblyModule_Fast
// 跳转模块
- (void)transition2PostComment
{
// URL子路径的首字母大小写都可以
XF_PUSH_URLComponent_Fast(@"bdj://essence/post/postComment");
}
@end
乐高支持在主窗口显示一个根组件,根组件也要提前注册才能使用:
#import "XFLegoVIPER.h" // 1.导入头文件
// 在应用加载完成方法调用:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 2.配置乐高框架
[[[XFLegoConfig defaultConfig] // 使有默认配置,只有这个是必需要有的
enableLog] // 允许打印log
addComponentHanderPlug:[LEMVVMModuleHandler class]]; // 添加扩展MVVM模块组件处理器(用来处理MVVM模块组件)
// 3.注册组件...
// 4.根据URL显示组件在主窗口
XF_ShowURLComponent2Window_Fast(@"bdj://indexTab")
// Other code here!
return YES;
}
注意: 例子中的代码来自一个通过乐高框架编写的完整项目:BDJProjectExample