美文网首页路由
iOS路由层设计简述

iOS路由层设计简述

作者: tom555cat | 来源:发表于2017-12-08 16:49 被阅读26次

    摘要: 路由层解决的核心问题就是原来界面或者组件之间相互调用都必须相互依赖,需要导入目标的头文件、需要清楚目标对象的逻辑,而现在全部都通过路由中转,只依赖路由或者某种通讯协议,或者依靠一些消息传递机制连路由都不依赖。简单来说,路由层需要实现的基本功能就是一个模块只通过路由器就可以调度另一个模块。

    相关工作

    目前Limboy[L1] [L2]和Casa[C1]提出了两种影响比较大的路由层设计方案。从基本功能来看,Limboy[L1]在调用其他模块时,直接引用一个"MGJRouter.h"头文件就可以了;而Casa[C1]需要引用与目标模块相关的"CTMediator+分类.h"头文件。所以Casa[C1]的方案可能会引用较多的"CTMediator+分类.h"头文件,其实从iOS的分类的角度来看,引用一个类的多个分类头文件和引用一个类的头文件并没有太多区别。两种方案的调用关系都是星型网状图。所以从基本功能的角度来看,两者并没有差异。

    从路由层的维护角度来看,Limboy[L1]的模块功能注册只考虑在+(void)load中注册,例如为一个UIViewController注册一个弹出自己的功能的示例代码如下所示:

    + (void)load {   
        [MGJRouter registerURLPattern:@"mgj://pushVC" toHandler:^(NSDictionary *routerParameters) {
            AnthoerViewController *vc = [AnthoerViewController sharedInstance];
            UINavigationController *navigationController = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController;
            [navigationController.visibleViewController.navigationController pushViewController:vc animated:YES];
        }];
    }
    

    所以Limboy[L1]只需要在模块内部调用自己的方法来对外提供功能。Casa[C1]是通过实现提供功能模块的CTMediator分类来实现的,CTMediator的模块相关分类为了避免引用模块头文件,通过字符串硬编码来获取模块内部的方法名。方法名硬编码会给路由层内部的维护造成一定困难。所以从路由层维护方的角度来看,Limboy[L1]直接调用模块内部方法,而Casa[C1]是通过硬编码调用模块内部方法,所以Limboy[L1]的方法对路由层的维护者更为方便。

    从路由层的使用者来看,Limboy[L1]是通过URL来使用模块提供的功能,URL带来的问题也就是硬编码的问题,同时使用者需要查看文档才能明白URL是提供了什么功能,需要传递哪些参数;而Casa[C1]在使用时只需要调用目标功能模块的CTMediator分类中提供的方法,可以方便地做到参数验证。

    所以,Limboy[L1]将硬编码的困难留给了模块调用者,而Casa[C1]将硬编码的困难留给了模块维护者。这就需要技术团队自己权衡利弊。

    参考文献

    [L1]: 蘑菇街 App 的组件化之路

    [L2]: 蘑菇街 App 的组件化之路·续

    [C1]: iOS应用架构谈 组件化方案

    相关文章

      网友评论

        本文标题:iOS路由层设计简述

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