陈江川

邮箱:jiangchuanc@gmail.com

如何使用BeeHive

BeeHive是阿里云推出的应用与iOS的App模块化框架方案。对该框架的介绍,可参考BeeHive,也可以看BeeHive —— 一个优雅但还在完善中的解耦框架,里面详细的介绍了BeeHive的内部实现。这里就再累赘的介绍内部的实现了,主要是介绍如何使用BeeHive。

BeeHive结构

在BeeHive中,任何一个Module都是有以下部分组成的:

假设一个ViewController就是一个Module,那么他们的关系如下:

Core

Core作为核心的部分,主要是对模块进行注册,实际上就是对ModuleProtocol和ServiceProtocol这两部分的注册。

ModuleProtocol注册

有三种方式:静态、动态、Annotation;

  • 静态:在BeeHive.plist添加对应的key-value

    // 然后调用API
    [BHContext shareInstance].moduleConfigName = @"BeeHive.bundle/BeeHive";
    
  • 动态:在load类方法中进行

    + (void)load {
        [BeeHive registerDynamicModule:[self class]];
    }
    

    或者使用BeeHive提供的一个宏

    BH_EXPORT_MODULE(NO)
    
  • Annotation

    BeeHiveMod(ShopModule)
    

ServiceProtocol注册

ServiceProtocol的注册和ModuleProtocol很类似

  • 静态:在BHService.plist中添加对应的key-value

    // 然后调用API
    [BHContext shareInstance].serviceConfigName = @"BeeHive.bundle/BHService";
    
  • 动态:在load类方法中进行

    + (void)load {
        [[BeeHive shareInstance] registerService:@protocol(TabBarServiceProtocol) 
                                 service:[JCTabBarController class]];
    }
    
  • Annotation

    BeeHiveService(TabBarServiceProtocol, JCTabBarController)
    

ModuleProtocol

ModuleProtocol的作用就是监听系统事件和模块的生命周期,我们可以在合适的地方做相应的操作,官方给的例子是根据当前的开发环境状态配置App

- (void)modSetup:(BHContext *)context {
    switch (context.env) {
        case BHEnvironmentDev:
        //....初始化开发环境
        break;
        case BHEnvironmentProd:
        //....初始化生产环境
        default:
        break;
    }
}

而在我给出的Demo中,做了以下几件事

PersionInfoModule.m

// 当App启动时调用该方法
- (void)modSetup:(BHContext *)context {
    NSLog(@"%s", __FUNCTION__);
    // 注册PersionInfoServiceProtocol,与PersionInfoViewController绑定
    [[BeeHive shareInstance] registerService:@protocol(PersionInfoServiceProtocol) 
                                     service:[PersionInfoViewController class]];
}

// 当App切换到后台,会调用该方法
- (void)modDidEnterBackground:(BHContext *)context {
    
    NSLog(@"%s", __FUNCTION__);
    
    // 根据key:PersionInfoServiceProtocol,创建出遵守PersionInfoServiceProtocol协议的对象
    id<PersionInfoServiceProtocol> persionVc = 
    [[BeeHive shareInstance] createService:@protocol(PersionInfoServiceProtocol)];
    
    // 如果该对象是控制器,则改变它的背景颜色
    if ([persionVc isKindOfClass:[UIViewController class]]) {
        UIViewController *Vc = (UIViewController *)persionVc;
        [Vc.view setBackgroundColor:[UIColor redColor]];
    }
}

// 当App切换到前台,会调用该方法
- (void)modWillEnterForeground:(BHContext *)context {
    
    NSLog(@"%s", __FUNCTION__);
    
    id<PersionInfoServiceProtocol> persionVc = 
    [[BeeHive shareInstance] createService:@protocol(PersionInfoServiceProtocol)];
    
    if ([persionVc isKindOfClass:[UIViewController class]]) {
        UIViewController *Vc = (UIViewController *)persionVc;
        
        // 等待两秒
        sleep(2);
        // 改变VC的背景颜色
        [Vc.view setBackgroundColor:[UIColor darkGrayColor]];
    }
}

ServiceProtocol

ServiceProtocol作用就是建立模块与模块间沟通的桥梁。假设我们想要在一个ViewController中跳转到另一个ViewController,只需这样:

ViewController1 ---> ViewController2

ViewController1.m

id<VC2ServiceProtocol> Vc2 = 
[[BeeHive shareInstance] createService:@protocol(VC2ServiceProtocol)];

if ([Vc2 isKindOfClass:[UIViewController class]]) {
    [self presentViewController:(UIViewController *)Vc2 animated:YES completion:nil];
}

在ServiceProtocol中可以声明方法和属性

PersionInfoServiceProtocol.h

@protocol PersionInfoServiceProtocol <NSObject, BHServiceProtocol>

/** PersionInfoModel */
@property (strong, nonatomic) PersionInfoModel *persionInfoModel;

- (void)persionTest;

@end

注意
声明的方法必须实现,否则会抛出异常!
声明的属性,在使用的时候必须@synthesize,这样会自动实现该属性的getter和setter方法,否则会抛异常!

PersionInfoViewController.m

@synthesize persionInfoModel = _persionInfoModel;

- (void)persionTest {
    NSLog(@"%s", __FUNCTION__);
}

以上就是BeeHive的基本用法,有任何问题可以在下面评论,大家一起探讨!文中Demo

« 部署Jenkins CI的坑 使用Routable后的思考 »