iOS-注解组件化(二)

作者: JerrySi | 来源:发表于2020-06-08 21:20 被阅读0次

    很早之前使用CTMediator做了组件化,在使用过程中有些不太方便的地方:

    1. Swift项目,底层使用OC的反射,本身就没有完全发挥出Swift的优势。
    2. runtime说不定什么就被苹果抛弃,不是长久之道,特别是这种项目中核心功能。
    3. 业务逻辑操作的时候Provider还不够灵活。

    基于以上3个原因,一直在考虑如何更加优雅的组件化。很早之前知道OC的依赖注入Objection,但是一直没有深入了解,后来又接触到Typhoon和Swinject。 觉得是否可以再仔细研究下。

    Objection & Typhoon

    这2个都是OC的库,具体用法可以参考https://www.jianshu.com/p/6177ec61f79f

    1. Objection使用起来比较灵活,用法比较简单。
    2. Typhoon的使用起来就比较规范,首先需要创建一个 TyphoonAssembly的子类。其需要注入的方法和属性都需要写在这个统一个子类中,当然可以实现不同的子类来完成不同的功能。
    抛弃Typhoon:

    Typhoon是只要继承TyphoonAssembly,那么这个类中所有方法,被通过runtime保存起来。 所以考虑即使Typhoon支持Swift,而且实际使用中的确不如Objection方便,所以被我很快抛弃了。

    使用Objection

    Objection整体代码虽然涉及到了runtime和KVC,但是我们可以避免使用。查看Objection源码发现在注入或者获取的时候,可能会涉及到。getObject的时候从context取,如果没有从globalContext获取,同时存入context。如果没有绑定过,就new一个对象,最终通过KVC设置对应属性。
    所以我们只要保证getObject之前是bind过对象的 同时不需要使用自动注入(比如objection_requires_sel), 这样核心功能就不会触发runtime了,效率得到保证。

    基于上面思想,我做了Objection组件Demo

    VC跳转流程:
    1. AModuleConfigure里面绑定了AViewController的Class Type和AModuleProvider
    2. AModuleProvider里面创建AViewController对象,设置对应参数。 返回实例对象
    3. 跳转的时候,通过Path 获取到AViewController的Class Type。 用Class Type在Objection里面找到对应AModuleProvider,从而得到具体vc实例对象进行跳转。

    (AModuleConfigure 和 AModuleProvider其实都可以放到CommonModule里面统一处理,这样会尽量避免objection污染)
    (第三步中通过Path 获取到AViewController的Class Type其实是反射,如果也是通过Objection来存储,应该效率更高些。 )

    获取Provider方法流程:
    1. CommonModule里面针对每个子Module创建一个Provider
    2. 子Module继承CommonModule里面的Provider,demo里面分别是AProviderLmpl和BProviderLmpl
    3. 在调用Provider里面单例方法的时候,由于AModuleConfigure里面绑定了Provider,所以获取到是AProviderLmpl。这样就可以使用AProviderLmpl里面的方法了。

    Swinject

    上面实现了OC项目组件化,那么Swift呢? 幸运的是也有对应的库Swinject
    因为Swinject再页面跳转传递参数的时候,不是很好控制。所以加上了URLNavigator来做路由管理。 当然OC项目也可以,这里列举2个:
    HHRouterJLRoutes

    VC跳转流程:
    1. 在ViewController里面(可以放到AppDelegate里面)注册Assembly,其中CommonAssembly会注册和初始化navigator
    2. ARouter里面注册了页面调整回调
    3. 通过调用CommonRouter里面的跳转方法来触发具Module里面之前的注册回调。
    获取Provider方法流程:
    1. CommonModule里面针对每个子Module创建一个Provider
    2. 子Module继承CommonModule里面的Provider,demo里面分别是AProviderImpl和BProviderImpl
    3. 在调用Provider里面单例方法的时候,由于AAssembly里面绑定了Provider,所以获取到是AProviderImpl。这样就可以使用AProviderImpl里面的方法了。

    可以在Common里面抽取、封装Swinject和URLNavigator,这样可以减少污染。

    相关文章

      网友评论

        本文标题:iOS-注解组件化(二)

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