BeeHive组件化框架

前言:

最近公司要使用阿里的BeeHive组件化框架,下面是学习的心得体会,偏向于使用层面,仅供参考!

一、组件化

通过构建中间层来组件化项目,共需要三步:

1. 创建protocol

protocol表示模块对外暴露的接口,需要继承BeeHive中的协议BHServiceProtocol。

2. 创建impClass

impClass是protocol对应的响应类,它需要遵守这个protocol协议,它可以是模块中一个已经存在的业务类,也可以是这个模块的一个封装类。

如果模块对外暴露的方法全部来自于同一个业务类,则可以将这个业务类设置成impClass;

如果模块对外暴露的方法全部来自于多个不同的业务类,则需要给这个模块创建一个封装类,通过这个封装类来实现对模块的调用,impClass指向这个封装类。

3. 设置protocol-impClass映射关系

在BeeHive中,所有protocol-impClass的映射关系都由BHServiceManager管理,在BHServiceManager类中,有一个叫做allServicesDict的属性,它保存了所有的protocol-impClass的映射关系。

allServicesDict是一个可变字典,其中key是protocol的字符串名称,value是impClass的字符串名称。

具体注册方式有下列三种

a. 使用BeeHive类的-[registerService:service:]

[[BeeHive shareInstance] registerService:@protocol(ModuleAServiceProtocol) service:[ModuleAService class]];

b. 使用宏BeeHiveService

@BeeHiveService(ModuleCServiceProtocol,ModuleCViewController)

c. 使用plist文件

[BHContext shareInstance].serviceConfigName = @"BeeHive.bundle/BHService";
调用具体实现类方法:
id moduleAService = [[BeeHive shareInstance] createService:@protocol(ModuleAServiceProtocol)];

二、事件分发

BeeHive本身会监听一些系统事件和应用事件,比如App生命周期、推送、handoff等,当事件发生时,BeeHive将其分发给各个模块,然后各个业务模块就可以在自己的Module类中调用各自的响应方法。

实现事件分发,共需要三步:

1、初始化Appdelegate需要继承BHAppdelegate

#import 
#import 

@interface AppDelegate : BHAppDelegate 


@end
//AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [BHContext shareInstance].application = application;
    [BHContext shareInstance].launchOptions = launchOptions;
    [BHContext shareInstance].moduleConfigName = @"BeeHive.bundle/BeeHive";
    [BHContext shareInstance].serviceConfigName = @"BeeHive.bundle/BHService";
    
    [BeeHive shareInstance].enableException = YES;
    [[BeeHive shareInstance] setContext:[BHContext shareInstance]];
    
    [super application:application didFinishLaunchingWithOptions:launchOptions];
    ...
    ...
    return YES;
}

2、创建并注册Module类

每一个需要响应事件的模块,都需要新建一个对应的Module类,Module类需要遵循BHModuleProtocol协议。然后注册ModuleAModule类。

#import "ModuleAModule.h"
#import "BHService.h"

@BeeHiveMod(ModuleAModule)
@interface ModuleAModule() 
@end

@implementation ModuleAModule

- (void)modContinueUserActivity:(BHContext *)context{
    
    //实现具体的事件处理
    
}

@end

注册方式如下:

//注册Module 方式一
@BeeHiveMod(ModuleAModule)

//注册Module 方式二
[BeeHive registerDynamicModule:[ModuleAModule class]];

3、调用响应方法

是在- (void)modContinueUserActivity:(BHContext *)context中进行的。

- (void)modContinueUserActivity:(BHContext *)context{
    //注册Module 方式二
//    [BeeHive registerDynamicModule:[ModuleAModule class]];
    
    NSUserActivity *userActivity = context.userActivityItem.userActivity;
    if ([userActivity.activityType isEqualToString:@"com.company.app.moduleA.one"]) {
    
        id moduleAService = [[BeeHive shareInstance] createService:@protocol(ModuleAServiceProtocol)];
        [moduleAService pushToModuleAOneViewController];
    }
}

三、实战应用

应用场景:ModuleA页面跳转ModuleAOne页面。跳转前先判断是否已登录,未登录跳转登录页面,登录后执行跳转ModuleAOne页面。已登录就直接跳转ModuleAOne页面。
LoginService
#import "LoginService.h"
#import "LoginViewController.h"

@BeeHiveService(LoginServiceProtocol,LoginService)
@implementation LoginService

-(void)loginIfNeedWithCompleteBlock:(void (^)(BOOL))completeBlock{
    BOOL hasLogined = NO;
    if (hasLogined) {
        completeBlock(YES);
        
    }else{
        
        UITabBarController *tab = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
        UINavigationController *nav = tab.selectedViewController;
        
        LoginViewController *login = [LoginViewController new];
        login.completeBlock = completeBlock;
        [nav presentViewController:login animated:YES completion:nil];
    }
}

@end
ModuleAService
#import "ModuleAOneViewController.h"
#import "ModuleAViewController.h"
#import "ModuleAService.h"
#import "LoginService.h"

@implementation ModuleAService

- (UIViewController *)getModuleAMainViewController{
    return [ModuleAViewController new];
}

- (void )pushToModuleAOneViewController{
    
    id loginService = [[BeeHive shareInstance] createService:@protocol(LoginServiceProtocol)];
    
    [loginService loginIfNeedWithCompleteBlock:^(BOOL isLogined) {
        if (isLogined) {
            UITabBarController *tab = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
            UINavigationController *nav = tab.selectedViewController;
            ModuleAOneViewController *one = [ModuleAOneViewController new];
            
            [nav pushViewController:one animated:YES];
        }
    }];
}

@end

代码:BeeHiveTestDemo

如果对你有帮助,请顺手点个star✨

你可能感兴趣的:(BeeHive组件化框架)