美文网首页APP & program
iOS多工程架构(三)—— CTMediator

iOS多工程架构(三)—— CTMediator

作者: 虞小虞 | 来源:发表于2022-03-01 16:21 被阅读0次

当我们组件化后,主项目与组件如何通讯成了主要问题。主项目要调用组件,想到的第一个办法就是把组件的方法访问权限改为Public。但是这么改,会导致耦合性提高,如何解耦呢,那就是在组件跟主项目中间再包一层,通过中间层去调用组件,那这个中间层就是CTMediator了。

CTMediator分为远程调用跟本地调用,如果没有其他APP,打开本地组件的需求,那只要用到本地调用。
CTMediator主要通过runtime来调用组件模块,如果是OC的调用只需要TargetAction便能调用指定模块下的方法。如果是Swift的话,则需要多一个参数kCTMediatorParamsKeySwiftTargetModuleName,因为OCSwift通过类名调用方法是不一样的。OC的类名是TargetSwift的类名得指定模块Module.Target

这里大概说一下,CTMediator是如何通过TargetAction来调用对应的方法的。这里附带CTMediator源码地址https://github.com/casatwy/CTMediator

- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget
{
    if (targetName == nil || actionName == nil) {
        return nil;
    }
    /// 获取Swift专属的ModuleName
    NSString *swiftModuleName = params[kCTMediatorParamsKeySwiftTargetModuleName];
    
    // generate target
    NSString *targetClassString = nil;
    if (swiftModuleName.length > 0) {
    // 如果是Swift,生成的targetName格式,Module.Target这种格式
        targetClassString = [NSString stringWithFormat:@"%@.Target_%@", swiftModuleName, targetName];
    } else {
    // 如果是OC则直接用Target作为targetName
        targetClassString = [NSString stringWithFormat:@"Target_%@", targetName];
    }
    // 从缓存拿target
    NSObject *target = [self safeFetchCachedTarget:targetClassString];
    // 如果没有缓存的target
    if (target == nil) {
    // 直接拿targetName来生成target
        Class targetClass = NSClassFromString(targetClassString);
        target = [[targetClass alloc] init];
    }

    // generate action
    NSString *actionString = [NSString stringWithFormat:@"Action_%@:", actionName];
    SEL action = NSSelectorFromString(actionString);
    
    if (target == nil) {
        // 这里是处理无响应请求的地方之一,这个demo做得比较简单,如果没有可以响应的target,就直接return了。实际开发过程中是可以事先给一个固定的target专门用于在这个时候顶上,然后处理这种请求的
        [self NoTargetActionResponseWithTargetString:targetClassString selectorString:actionString originParams:params];
        return nil;
    }
    
    // 如果允许缓存,那么就保存Target,key为targetName
    if (shouldCacheTarget) {
        [self safeSetCachedTarget:target key:targetClassString];
    }

    if ([target respondsToSelector:action]) {
        // 如果target能正常响应Action,就用签名的方式,调用对应target的方法
        return [self safePerformAction:action target:target params:params];
    } else {
        // 这里是处理无响应请求的地方,如果无响应,则尝试调用对应target的notFound方法统一处理
        SEL action = NSSelectorFromString(@"notFound:");
        if ([target respondsToSelector:action]) {
            return [self safePerformAction:action target:target params:params];
        } else {
            // 这里也是处理无响应请求的地方,在notFound都没有的时候,这个demo是直接return了。实际开发过程中,可以用前面提到的固定的target顶上的。
            [self NoTargetActionResponseWithTargetString:targetClassString selectorString:actionString originParams:params];
            @synchronized (self) {
                [self.cachedTarget removeObjectForKey:targetClassString];
            }
            return nil;
        }
    }
}

这里是调用CTMediator的入口,也算是最主要的代码了,通过拿到TargetAction再利用方法签名的方式,调用对应Target里面的方法(Action),以达到主工程调用组件的目的。具体怎么拿TargetAction,代码已经给上注释了。要注意的是如果是Swift的话,会拿ModuleName,所拼接的Target也是跟OC不一样的。

[self safePerformAction:action target:target params:params]这个方法里面的代码就不贴出来了,可以下载源码自己进去看,这里就是用方法签名来调用对应Target的方法(Action)

这个库的代码不多,也不难,主要是思路。怎么用的话,可以下载源码,里面有demoSwiftOC都有。组件化最基础的写法大概就这样了。

相关文章

  • iOS多工程架构(三)—— CTMediator

    当我们组件化后,主项目与组件如何通讯成了主要问题。主项目要调用组件,想到的第一个办法就是把组件的类,方法的访问权限...

  • 07 CTMediator iOS组件化方案

    关于iOS组件化方案在Casa的iOS应用架构谈 组件化方案写得已经很清楚了。方案本身并不难,CTMediator...

  • 组件化方案

    组件化方案引用 在现有工程中实施基于CTMediator的组件化方案 iOS组件化实践(一):简介 iOS组件化实...

  • CTMediator源码拾遗

    一句话简介:CTMediator为casa大神针对iOS组件化方案的一个架构实例。架构详解: 传送门Github:...

  • ios 组件化

    参考 iOS 组件化实践《二》基于现有项目拆分组件化实践 在现有工程中实施基于CTMediator的组件化方案 i...

  • iOS多工程架构(一)—— 创建

    多工程架构,是由多个Project包裹在一个Workspace里面的一种架构。其主要目的是为将不同的功能分割开,由...

  • CTMediator源码阅读和实际使用

    iOS组件化CTMediator代码阅读及实际项目使用 前言 当项目代码量越来越大,团队人数越来越多,单一工程的开...

  • 在现有工程中实施基于CTMediator的组件化方案

    在现有工程中实施基于CTMediator的组件化方案

  • iOS架构

    公司项目采用了这个架构开发。 讲iOS架构不得不说到工程目录,我的工程目录由business、common、loc...

  • iOS多工程架构(二)—— 组件化

    上一篇的多工程架构是,手动创建多project的方式。现在这篇是同个pod的方式进行组件化开发的。 一、创建远程索...

网友评论

    本文标题:iOS多工程架构(三)—— CTMediator

    本文链接:https://www.haomeiwen.com/subject/cfwehrtx.html