美文网首页
iOS 移动端组件化

iOS 移动端组件化

作者: Sharif_su | 来源:发表于2021-09-06 14:59 被阅读0次

路由是一个很好的解耦的方案,它可以为各个组件之间调用提供遍历,没有路由,组件化也是可以用的。

业界常见的三种解决方案

1.Url-scheme注册(MGJRouter)

iOS系统中默认是支持 url scheme方式的,例如可以在浏览器中输入: weixin:// 就可以打开微信应用。自然在APP内部也可以通过这种方法来实现组件之间的路由设计。

这种方式实现的原理是在APP启动的时候,或者是向以下实例中的每个模块自己的load方法里面注册自己的断链(url),以及对外提供服务(Block),通过url-scheme标记好,然后维护在url-router里面。 url-router中保存了各个组件对应的url-scheme,只要其它组件调用了 open url 的方法,url-router就会去根据url去查找对应的服务并执行,详见demo。

1.1 URL的命名规范

遵循网上通用的 URIweb service模式的资源通用表示方式) 的格式,例如 appscheme://pathctd://home/scan

1.2 常见案例

1.2.1 JLRoutes git 上 star 最多的一个开源库

本质可以理解为保存一个全局的mapkeyurl,value是对应存放的block数组urlblock都会常驻在内存中,当打开一个url时,GLRoutes就可以遍历这个全局的map,通过url来执行对应的block

1.2.2 routable-ios
1.2.3 HHRouter
1.2.4 MGJRouter

蘑菇街的技术团队开源的一个router,特点是使用简单方便,JLRoutes的问题主要在于查找url的实现不够高效,通过遍历而不是匹配。还有就是功能偏多。HHRouterurl查找是基于匹配,所以会更高效,MGJRouter也是采用的这种方法,但它和viewcontroller绑定地过于紧密,一定程度上降低了灵活性。于是就有了 MGJrouter, 从数据结构上看它和 HHRouter是一样的。

蘑菇街方案不好的地方:

  1. URL注册对于实施组件化是完全没有必要的,拓展性和可维护性都降低;
  2. 基于 Open-url 的方案的话,有一个致命缺陷:非常规对象无法参与本地组件间调度;但是可以通过传递parms来解决,但是这个区分了远程调用和本地调用的接口;
  3. 模块内部是否仍然需要使用URL去完成调度?是没有必要的,为啥要复杂化?
  4. 当组件多起来的时候,需要提供一个关乎URL和服务的对应表,并且需要开发人员对这样一个表进行维护;
  5. 这种方式需要在APP启动时,每个组件需要到路由管理中心注册自己的URL及服务,因此 内存中需要保存这样一份表,当组件多起来以后就会出现一些内存的问题
  6. 混淆了本地调用和远程调用,它们的处理逻辑是不同的,正确的做法应该是把远程调用通过一个中间层转化成本地调用,如果把两者混为一谈,后期可能会出现无法区分业务的情况。比如对于组件无法响应的问题,远程调用可能直接显示一个404页面,但是本地调用可能需要做其它处理。如果不加以区分,那么就无法完成这种业务要求。 远程调用只能传递被序列化JSON的数据,像UIImage这样非常规的对象是不行的,所以如果组件接口要考虑远程调用,这里的参数与就不能是这类非常规对象

2.利用Runtime实现的target-action方式(CTMediator)- 推荐

相较于url-scheme的方式进行组件间的路由,runtime的方式借助了OC运行时的特征,实现了组件间服务的自动发现,无需注册即可实现组件间的调用,因此,不管从维护性、可读性、扩展性来说,都是一个比较完美的方案, 详见demo。

原理:

传统的中介者模式,这个中间件Mediator会依赖其它组件,其它组件也会依赖mediator, 但是能不能让mediator不在依赖组件,各个组件之间不再依赖,组件间调用只依赖中间者mediator
casa 大神是这样优化的:
利用target-action的方式,创建一个taget的类,里面定义了一些action方法,这些方法的结果是返回一个controller或其它object,再给中间件CTMedator添加一个分类方法,定义组件外部可调用的方法接口,内部实现方法 perform:target:action的方法,主要通过runtime中的 NSClassFromString 获取target类和 NSSelectorFromString 获取方法名,这样就可以执行先去创建的 target类中的方法得到返回值,再通过分类中的方法传值出去,完美解决~

3.protcol-class注册

通过协议绑定,核心思想和代理传值是一样的,遵循协议,实现协议中的方法,详见demo。

主要思路
1、创建一个头文件 CommonProtocol.h ,里面存放各个模块提供的协议。在各个模块依赖这个头文件,实现协议的方法。
2、创建一个中间类 ProtocolMediator, 提供模块的注册和获取模块的功能(其实就是将类和协议名进行绑定,放在一个字典里,key是协议名字符串,value是类)。
3、在各个模块中实现协议,核心代码如下:

Class cls = [[ProtocolMediator sharedInstance] classForProtocol:@protocol(B_VC_Protocol)];   
UIViewController<B_VC_Protocol> *B_VC = [[cls alloc] init];
[B_VC action_B:@"param1" para2:222 para3:333 para4:444];
[self presentViewController:B_VC animated:YES completion:nil];

总结
通过这次对路由方案的研究,认识到了自己对系统架构方面的认识还是太少,以前并没有认真考虑怎么去设计一个好代码,我们需要的事写一些优质代码,牢记 低耦合、高内聚、职责单一逻辑清晰,不能甘心做码农,只知道堆代码!!

相关文章

  • 组件化

    移动端iOS组件化[https://www.sohu.com/a/470668679_827544] iOS组件化...

  • iOS有关架构组件化的文章链接

    iOS应用架构谈 组件化方案 iOS 组件化方案探索 iOS移动端架构的那些事 如何优雅的实现界面跳转 之 统跳协...

  • 移动端iOS组件化

    首先放出本文组件化框架GitHub地址: CJLRouter[https://github.com/lele844...

  • iOS 移动端组件化

    路由是一个很好的解耦的方案,它可以为各个组件之间调用提供遍历,没有路由,组件化也是可以用的。 业界常见的三种解决方...

  • iOS 组件通信方案

    1. 阅读本篇文章以前,假设你已经了解了组件化这个概念。 最近两年移动端的组件化特别火,但移动端组件化的概念追其溯...

  • 2019年大前端技术周刊-#31周

    本周是2019年第31周,裂墙推荐工程师成长三连击系列文章 移动端 有赞移动 iOS 组件化(模块化)架构设计实践...

  • WCDB相关文章链接

    微信移动端数据库组件 WCDB 系列:iOS 基础篇(一)微信移动端数据库组件 WCDB 系列:数据库修复三板斧(...

  • iOS系统架构

    1: 滴滴出行iOS客户端架构演进之路 2: iOS应用架构谈 组件化方案 3:iOS组件化方案调研 4: 饿了么...

  • iOS native基于视图树 视图快照的页面diff

    适用于 iOS 应用中基于 native 组件的页面,包括 RN 等跨平台页面 背景 移动端自动化测试框架繁多,测...

  • iOS组件化

    iOS组件化 iOS组件化

网友评论

      本文标题:iOS 移动端组件化

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