1.按業(yè)務(wù)分模塊,按功能分組件
CTMediator的方案
各個模塊通過CTMediator中的target-action方案調(diào)動
在CTMediator分類中是需要模塊的調(diào)度胸竞,對模塊起了一層封裝
CTMediator使用runtime動態(tài)創(chuàng)建Target和調(diào)用Target中的Action來實現(xiàn)解耦。
#import "CTMediator+A.h"
@implementation CTMediator (A)
- (UIViewController *)A_aViewController
{
//調(diào)用Target_A的Action_viewController
return [self performTarget:@"A" action:@"viewController" params:nil shouldCacheTarget:NO];
}
@end
在模塊A中寫好target-Action規(guī)則
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
//我們在A工程中創(chuàng)建一個文件夾:Targets锦溪,然后看到A_Category里面有performTarget:@"A",所以我們新建一個對象府怯,叫做Target_A刻诊。
@interface Target_A : NSObject
//對應(yīng)的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:無法在編譯檢查階段檢測接口參數(shù)變更等問題
BeeHive
BHModuleProtocol
該框架的BHModuleProtocol
是讓模塊有生命周期牺丙。
每個遵循BHModuleProtocol
的模塊注冊后都會給BHModuleManager
中做初始化存儲起來则涯,系統(tǒng)的事件會被傳遞給每個模塊,讓每個模塊自己決定編寫業(yè)務(wù)處理邏輯冲簿。
兩種注冊模式粟判,一種是靜態(tài)一種是動態(tài)
靜態(tài):
的在BeeHive.plist文件中注冊符合BHModuleProtocol協(xié)議模塊類
動態(tài):
/*
1. Annotation方式注冊
編譯時動態(tài)處理,動態(tài)生成代碼
通過BeeHiveMod宏進行Annotation可以在編譯時動態(tài)添加該模塊峦剔。
*/
@BeeHiveMod(LMHomeModule)
/*
* 2.使用BH_EXPORT_MODULE宏注冊
*/
@implementation HomeModule
BH_EXPORT_MODULE() // 聲明該類為模塊入口
@end
BHServiceProtocol
BHServiceProtocol
是提供接口和規(guī)范接口的類档礁。
通過處理Event編寫各個業(yè)務(wù)模塊可以實現(xiàn)插件化編程,各業(yè)務(wù)模塊之間沒有任何依賴吝沫,core與module之間通過event交互呻澜,實現(xiàn)了插件隔離。但有時候我們需要模塊間的相互調(diào)用某些功能來協(xié)同完成功能惨险。
兩種注冊方式
1.API注冊
[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];
2.BHService.plist注冊
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>HomeServiceProtocol</key>
<string>BHViewController</string>
</dict>
</plist>
對于有些場景下羹幸,我們訪問每個聲明Service的對象,希望對象能保留一些狀態(tài)辫愉,那我們需要聲明這個Service對象是一個單例對象栅受。
我們只需要在Service對象中實現(xiàn)事件函數(shù)
聲明
-(BOOL) singleton
{
return YES;
}
service的注冊過程
service注冊后會給BHServiceManager
中管理起來
//協(xié)議字符串作為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];
}
調(diào)用Service
id< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];
上下文環(huán)境BHContext
初始化設(shè)置應(yīng)用的項目信息,并在各模塊間共享整個應(yīng)用程序的信息
[BHContext shareInstance].env = BHEnvironmentDev; //定義應(yīng)用的運行開發(fā)環(huán)境
[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]];