博客> BeeHive使用体会
BeeHive使用体会
2017-11-24 15:49 评论:0 阅读:153 kyloMooa
ios 模块解耦

为什么使用BeeHive?

优点

  • 插件化的模块开发运行框架。注册每个子模块和所需的服务,根据服务实现模块间的调用。
  • 模块生命周期管理,扩展了应用的系统事件。
  • 全局单例context数据共享
  • 自定义事件扩展,通过事件分发方便了模块间通讯(子模块实现modDidCustomEvent:,根据tag来区分不同的事件)
  • 每个模块迁移时只需要pod到已配置的BeeHive框架项目中即可,有效的降低了重复工作时间,提供了工作效率。
  • 统一cocoaPods管理每个模块,模块化编程避免了团队中因为某个模块的bug而耽误其它模块开发进度的情况。

缺点

  • Service和Impl解耦但是无法避免对Protocol的解耦。需维护一个服务协议模块供其它模块调用。

1 模块生命周期的事件

BeeHive会给每个模块提供生命周期事件,用于与BeeHive宿主环境进行必要信息交互,感知模块生命周期的变化。 事件分为三种类型: 系统事件 通用事件 业务自定义事件

1.1 系统事件

系统事件通常是Application生命周期事件,例如DidBecomeActive、WillEnterBackground等。 系统事件基本工作流如下:

1.2 通用事件

在系统事件的基础之上,扩展了应用的通用事件,例如modSetup、modInit等,可以用于编码实现各插件模块的设置与初始化。 扩展的通用事件如下:

1.3 业务自定义事件

如果觉得系统事件、通用事件不足以满足需要,我们还将事件封装简化成BHAppdelgate,你可以通过继承 BHAppdelegate来扩展自己的事件。

2. 模块注册

模块注册的方式有静态注册(官方推荐)与动态注册两种。

2.1 静态注册

通过在BeeHive.plist文件中注册符合BHModuleProtocol协议模块类:

2.2 动态注册

@implementation HomeModule
BH_EXPORT_MODULE()  // 声明该类为模块入口
@end
在模块入口类实现中 使用BH_EXPORT_MODULE()宏声明该类为模块入口实现类。

2.3 异步加载

如果设置模块导出为BH_EXPORT_MODULE(YES),则会在启动之后第一屏内容展现之前异步执行模块的初始化,可以优化启动时时间消耗。

二、使用规则

1.新建module 遵守 BHModuleProtocol协议对模块进行初始化

@interface SCForumModule () <BHModuleProtocol>

@end
-(void)modInit:(BHContext *)context
{
    NSLog(@"模块初始化中");

    id<SCForumProtocol> service = [[BeeHive shareInstance] createService:@protocol(SCForumProtocol)];
    service.user = [SCUser getLoginAccount];
}

- (void)modSetUp:(BHContext *)context
{
    [[BeeHive shareInstance]  registerService:@protocol(SCForumProtocol) service: [SCForumViewController class]];

    NSLog(@"ForumModule setup");

}

2.新建服务协议 遵守 BHServiceProtocol 协议

#import <Foundation>
@protocol SCForumProtocol <NSObject>
@property (nonatomic, strong)SCUser *user;

@end

3.在对应的controller中 遵守 服务协议

@interface SCForumViewController ()<SCSendPostViewControllerDelegate>
@property (nonatomic, strong) UIButton *postBtn;
@property (nonatomic, strong) NSMutableArray *categoriesArray;
@property (nonatomic, strong) NSMutableArray *pagesArray;
@property (nonatomic, strong) NSMutableArray *allPagesArray;
@property (nonatomic, strong) NSMutableArray *cateIdArray;

@end

4.在module对controller注册服务

如果模块有需要启动时初始化的逻辑,可以在modInit里编写,例如模块注册一个外部模块可以访问的Service接口
  [[BeeHive shareInstance]  registerService:@protocol(SCForumProtocol) service: [SCForumViewController class]];

5.通过createService获取到该controller

id<SCForumProtocol> service = [[BeeHive shareInstance] createService:@protocol(SCForumProtocol)];

6.controller单例与多例的控制

对于有些场景下,我们访问每个声明Service的对象,希望对象能保留一些状态,那我们需要声明这个Service对象是一个单例对象。
我们只需要在Service对象中实现事件函数
声明
-(BOOL) singleton
{
    return YES;
}
通过createService获取的对象则为单例对象,如果实现上面函数返回的是NO,则createService返回的是多例。
id< HomeServiceProtocol> homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];

7.各模块间共享整个应用程序的信息Context

初始化设置应用的项目信息,并在各模块间共享整个应用程序的信息
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [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]];

    [super application:application didFinishLaunchingWithOptions:launchOptions];

    id<HomeServiceProtocol> homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];

    if ([homeVc isKindOfClass:[UIViewController class]]) {
        UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:(UIViewController*)homeVc];

        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.window.rootViewController = navCtrl;
        [self.window makeKeyAndVisible];
    }

    return YES;
}

三、工程集成

1.cocoapods

pod "BeeHive", '1.1.1'

2.修改appdelegate.h

@interface AppDelegate : BHAppDelegate

3.初始化设置应用的项目信息

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
 [BHContext shareInstance].application = application;
    [BHContext shareInstance].launchOptions = launchOptions;
//    [BHContext shareInstance].moduleConfigName = @"BeeHive.bundle/BeeHive";//可选,默认为BeeHive.bundle/BeeHive.plist
//    [BHContext shareInstance].serviceConfigName = @"BeeHive.bundle/BHService";

    [BeeHive shareInstance].enableException = YES;
    [[BeeHive shareInstance] setContext:[BHContext shareInstance]];
    [[BHTimeProfiler sharedTimeProfiler] recordEventTime:@"BeeHive::super start launch"];

    [super application:application didFinishLaunchingWithOptions:launchOptions];
    ...
    }

list text here

收藏
0
sina weixin mail 回到顶部