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-注解组件化(二)

    很早之前使用CTMediator做了组件化,在使用过程中有些不太方便的地方: Swift项目,底层使用OC的反射,...

  • Android好文章集合

    Java注解处理器Android组件化Httphttp缓存

  • iOS 组件化开发之CocoaPods创建私有库

    什么是组件化开发,我就不详细介绍了,网上可以找到很多资料.IOS-组件化架构漫谈这篇文章就比较全面的介绍了组件化开...

  • iOS-组件化

    一. 组件化 1. 组件化分析 支付宝的界面我们都很熟悉,它的每个模块都能做成一个APP了,支付宝的业务量之大也不...

  • iOS-组件化

    在做iOS组件化的时候,我没有找到像ARouter一样兼容性和使用性比较好的框架。经过权衡后,决定使用CTMedi...

  • Spring 通过注解配置 Bean

    扫描组件 Spring 能够从 classpath 下自动扫描,侦测和实例化具有特定注解的组件。 特定组件包括:C...

  • spring学习11(注解方式配置bean)

    组件扫描 Spring能够从classPath下自动扫面,侦测和实例化具有特点注解的组件 特定组件包括:(标识在类...

  • Spring通过注解配置bean

    在classpath中扫描组件 组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解...

  • iOS-组件化问题

    1、每次在验证索引文件时,podspec中的版本号必须和提交代码时候打的tag一致,不然验证不通过。 注意,千万不...

  • iOS-浅谈组件化

    前言 什么是组件化,为什么要有组件化,组件化跟我们的项目又有什么关系,或者说它能给我们的项目带来什么,我们带着疑问...

网友评论

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

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