1.按业务分模块,按功能分组件
CTMediator的方案
各个模块通过CTMediator中的target-action方案调动
在CTMediator分类中是需要模块的调度,对模块起了一层封装
CTMediator使用runtime动态创建Target和调用Target中的Action来实现解耦。
#import "CTMediator+A.h"
@implementation CTMediator (A)
- (UIViewController *)A_aViewController
{
//调用Target_A的Action_viewController
return [self performTarget:@"A" action:@"viewController" params:nil shouldCacheTarget:NO];
}
@end
在模块A中写好target-Action规则
#import
#import
//我们在A工程中创建一个文件夹:Targets,然后看到A_Category里面有performTarget:@"A",所以我们新建一个对象,叫做Target_A。
@interface Target_A : NSObject
//对应的Action是viewController,于是在Target_A中新建一个方法:Action_viewController
- (UIViewController *)Action_viewController:(NSDictionary *)params;
@end
#import "Target_A.h"
#import "AViewController.h"
@implementation Target_A
- (UIViewController *)Action_viewController:(NSDictionary *)params
{
AViewController *viewController = [[AViewController alloc] init];
return viewController;
}
@end
ps:无法在编译检查阶段检测接口参数变更等问题
BeeHive
BHModuleProtocol
该框架的BHModuleProtocol
是让模块有生命周期。
每个遵循BHModuleProtocol
的模块注册后都会给BHModuleManager
中做初始化存储起来,系统的事件会被传递给每个模块,让每个模块自己决定编写业务处理逻辑。
两种注册模式,一种是静态一种是动态
静态:
的在BeeHive.plist文件中注册符合BHModuleProtocol协议模块类
动态:
/*
1. Annotation方式注册
编译时动态处理,动态生成代码
通过BeeHiveMod宏进行Annotation可以在编译时动态添加该模块。
*/
@BeeHiveMod(LMHomeModule)
/*
* 2.使用BH_EXPORT_MODULE宏注册
*/
@implementation HomeModule
BH_EXPORT_MODULE() // 声明该类为模块入口
@end
BHServiceProtocol
BHServiceProtocol
是提供接口和规范接口的类。
通过处理Event编写各个业务模块可以实现插件化编程,各业务模块之间没有任何依赖,core与module之间通过event交互,实现了插件隔离。但有时候我们需要模块间的相互调用某些功能来协同完成功能。
两种注册方式
1.API注册
[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];
2.BHService.plist注册
HomeServiceProtocol
BHViewController
对于有些场景下,我们访问每个声明Service的对象,希望对象能保留一些状态,那我们需要声明这个Service对象是一个单例对象。
我们只需要在Service对象中实现事件函数
声明
-(BOOL) singleton
{
return YES;
}
service的注册过程
service注册后会给BHServiceManager
中管理起来
//协议字符串作为key
NSString *key = NSStringFromProtocol(service);
//implClass字符串左为value
NSString *value = NSStringFromClass(implClass);
if (key.length > 0 && value.length > 0) {
[self.lock lock];
[self.allServicesDict addEntriesFromDictionary:@{key:value}];
[self.lock unlock];
}
调用Service
id< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];
上下文环境BHContext
初始化设置应用的项目信息,并在各模块间共享整个应用程序的信息
[BHContext shareInstance].env = BHEnvironmentDev; //定义应用的运行开发环境
[BHContext shareInstance].application = application;
[BHContext shareInstance].launchOptions = launchOptions;
[BHContext shareInstance].moduleConfigName = @"BeeHive.bundle/CustomModulePlist";//可选,默认为BeeHive.bundle/BeeHive.plist
[BHContext shareInstance].serviceConfigName = @"BeeHive.bundle/CustomServicePlist";//可选,默认为BeeHive.bundle/BHService.plist
[[BeeHive shareInstance] setContext:[BHContext shareInstance]];
Demo地址