iOS 路由方案对比

2,073 阅读2分钟

target-action方案

通过给组件包装一层wrapper来给外界提供服务,然后调用者通过依赖中间件来使用服务;其中,中间件是通过runtime来调用组件的服务,是真正意义上的解耦,也是该方案最核心的地方。具体实施过程是给组件封装一层target对象来对外提供服务,不会对原来组件造成入侵;然后,通过实现中间件的category来提供服务给调用者,这样使用者只需要依赖中间件,而组件则不需要依赖中间件。

优点:

  • 可读性,维护性,可扩展性高
  • 内存中不需要维护映射表
  • 不需要注册, 不影响启动速度
  • 调用效率高

缺点:

  • 不能跨平台使用
  • 也是需要维护一个 target 类
  • 还是字符串来获取类名,也是存在一定风险的。

[github.com/meili/MGJRo…]

MGJRouter

这是蘑菇街中应用的一种页面间调用的方式,通过在启动时注册组件提供的服务,把调用组件使用的url和组件提供的服务block对应起来,保存到内存中。在使用组件的服务时,通过url找到对应的block,然后获取服务。

优点:

1. 统一ios和安卓平台,使用一套后台来管理url
2. 方便H5跳转APP

缺点:

1. 内存中需要维护url表,组件多了可能会有内存问题
2. 启动的时候需要注册,可能会影响启动速度
3. url传参数被限制,没有办法传 UIImage,NSData等类型
4. 组件本身依赖中间件,分散注册,使用的耦合较多
5. 查找URL不够高效
6. 路由写错后,编译没有问题,而运行可能会出现问题。

[github.com/meili/MGJRo…]

protocol-class

蘑菇街又提出了另一种组件化的方案,就是通过protocol定义服务接口,组件通过实现该接口来提供接口定义的服务,具体实现就是把protocol和class做一个映射,同时在内存中保存一张映射表,使用的时候,就通过protocol找到对应的class来获取需要的服务。

优点:

  • 解决无法传递非常规参数问题
  • 协议方法改变之后,调用的地方也会报错。
  • 协议没有实现的话,会有警告

缺点:

  • 内存中需要维护映射表
  • 协议方法虽然包警告,但是调用者并不知道有没有实现