iOS开发好文

iOS面试要点之组件化面试要点

2020-12-27  本文已影响0人  iOS开发面试题技术合集

作者:akon
原文地址:https://xiaozhuanlan.com/topic/7986120534

组件化

作用

组件化的作用是模块解耦、代码复用。

方案

MGJRouter

MGJRouter通过注册url的方式来实现方法注册和调用
1、组件提供方通过registerURLPattern注册方法。

[MGJRouter registerURLPattern:@"mgj://category/travel" toHandler:^(NSDictionary *routerParameters) {
    NSLog(@"routerParameters[MGJRouterParameterUserInfo]:%@", routerParameters[MGJRouterParameterUserInfo]);
    // @{@"user_id": @1900}
}];

2、调用方通过openURL调用组件提供的方法。

[MGJRouter openURL:@"mgj://category/travel" withUserInfo:@{@"user_id": @1900} completion:nil];

该种方案的缺点有:

CTMediator

CTMediator通过CTMediator的类别来实现方法调用。
1、组件提供方实现Target、Action。

@interface Target_A : NSObject

- (UIViewController *)Action_nativeFetchDetailViewController:(NSDictionary *)params;

@end

- (UIViewController *)Action_nativeFetchDetailViewController:(NSDictionary *)params
{
    // 因为action是从属于ModuleA的,所以action直接可以使用ModuleA里的所有声明
    DemoModuleADetailViewController *viewController = [[DemoModuleADetailViewController alloc] init];
    viewController.valueLabel.text = params[@"key"];
    return viewController;
}

2、组件提供方实现CTMediator类别暴露接口给使用方。

@interface CTMediator (CTMediatorModuleAActions)

- (UIViewController *)CTMediator_viewControllerForDetail;

@end

- (UIViewController *)CTMediator_viewControllerForDetail
{
    UIViewController *viewController = [self performTarget:kCTMediatorTargetA
                                                    action:kCTMediatorActionNativFetchDetailViewController
                                                    params:@{@"key":@"value"}
                                         shouldCacheTarget:NO
                                        ];
    if ([viewController isKindOfClass:[UIViewController class]]) {
        // view controller 交付出去之后,可以由外界选择是push还是present
        return viewController;
    } else {
        // 这里处理异常场景,具体如何处理取决于产品
        return [[UIViewController alloc] init];
    }
}

3、组件调用方通过引入CTMediator (CTMediatorModuleAActions)来调用组件的接口

#import "CTMediator +CTMediatorModuleAActions.h"
UIViewController* vc = [[CTMediator sharedInstance] CTMediator_viewControllerForDetail];

此种方案的优点是通过Targrt-Action实现了组件之间的解耦,通过暴露方法给组件使用方,避免了url直接传递字典带来的问题。
缺点是:

BeeHive

BeeHive通过url来实现页面路由,通过Protocol来实现方法调用。
一、组件提供方注册service

[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];

二、组件调用方调用service

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

// use homeVc do invocation

笔者强烈推荐使用BeeHive这种方式来做组件化,基于Protocol(面向接口)来实现组件化有如下优点:

组件管理与发布

可以采用私有pod库来管理。笔者采用的是私有远程pod+本地pod结合来管理的

资料推荐

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

上一篇 下一篇

猜你喜欢

热点阅读