美文网首页
iOS组件化方案

iOS组件化方案

作者: 小丫小峰子 | 来源:发表于2017-07-05 12:54 被阅读0次

    公共基础服务

    • 网络服务
    • 本地资源服务
    • 缓存服务
    • 常用的Extension工具集合(字符串的处理,日期时间的格式化)

    1.URL注册方案

    • JLRoutes
      JLRoutes全局会保存一个Map,这个Map会以scheme为Key,JLRoutes为Value。所以在routeControllerMap里面每个scheme都是唯一的。
      在每个JLRoutes里面都保存了一个数组,这个数组里面保存了每个路由规则JLRRouteDefinition里面会保存外部传进来的block闭包,pattern,和拆分之后的pattern。

    在每个JLRoutes的数组里面,会按照路由的优先级进行排列,优先级高的排列在前面。

    注册服务:

    [JLRoutes addRoute:@"/:object/:action/:primaryKey" handler:^BOOL(NSDictionary *parameters) {
      NSString *object = parameters[@"object"];
      NSString *action = parameters[@"action"];
      NSString *primaryKey = parameters[@"primaryKey"];
      // do something here
      return YES;
    }];
    

    调用:

    [JLRoutes routeURL:url];
    

    优点:

    服务器可以动态的控制页面跳转,可以统一处理页面出问题之后的错误处理,可以统一三端,iOS,Android,H5 / RN / Weex 的请求方式。

    缺点:

    1.URL短连接分布式注册时候,导航的硬编码太多,容易写错导致调用失败
    2.class的load方法完成注册,太多对启动app时主线程有影响
    3.内存常驻比较严重,所有的ur,class,实例, block 必须提前注册好,使用时对象释放可能出错

    2.Target-Action方案

    CTMediator

    本地应用调用
    本地组件A在某处调用[[CTMediator sharedInstance] performTarget:targetName action:actionName params:@{...}]CTMediator发起跨组件调用,CTMediator根据获得的targetaction信息,通过objective-C的runtime转化生成target实例以及对应的action选择子,然后最终调用到目标业务提供的逻辑,完成需求。

    远程应用调用
    远程应用通过openURL的方式,由iOS系统根据info.plist里的scheme配置找到可以响应URL的应用(在当前我们讨论的上下文中,这就是你自己的应用),应用通过AppDelegate接收到URL之后,调用CTMediator的openUrl:方法将接收到的URL信息传入。当然,CTMediator也可以用openUrl:options:的方式顺便把随之而来的option也接收,这取决于你本地业务执行逻辑时的充要条件是否包含option数据。传入URL之后,CTMediator通过解析URL,将请求路由到对应的targetaction,随后的过程就变成了上面说过的本地应用调用的过程了,最终完成响应。

    针对请求的路由操作很少会采用本地文件记录路由表的方式,服务端经常处理这种业务,在服务端领域基本上都是通过正则表达式来做路由解析。App中做路由解析可以做得简单点,制定URL规范就也能完成,最简单的方式就是scheme://target/action这种,简单做个字符串处理就能把targetaction信息从URL中提取出来了。

    优点:

    1.充分的利用Runtime的特性,无需注册这一步。Target-Action方案只有存在组件依赖Mediator这一层依赖关系。在Mediator中维护针对Mediator的Category,每个category对应一个Target,Categroy中的方法对应Action场景。Target-Action方案也统一了所有组件间调用入口。
    2.有一定的安全保证,它对url中进行Native前缀进行验证。

    缺点:

    Target_Action在Category中将常规参数打包成字典,在Target处再把字典拆包成常规参数,这就造成了一部分的硬编码。

    3.Protocol-Class注册方案

    项目案例:
    CRMainProject

    优点:

    没有硬编码

    缺点:

    1.每个Protocol都要向ModuleManager进行注册。
    2.ModuleEntry是同时需要依赖ModuleManager、ModuleEntryProtocol和组件里面的页面或者组件两者的

    相关文章

      网友评论

          本文标题:iOS组件化方案

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