iOS解耦与模块化之路 -路由的构建使用

来源:互联网 发布:故宫文创和故宫淘宝 编辑:程序博客网 时间:2024/06/05 09:41

上一篇中介绍了项目解耦中的构建Spec私有库,这篇记录一下本次模块化之路的另一个重要环节,构建路由。

路由,可以理解为一个模块的调度中心。我们写项目时,经常有业务模块与业务模块、业务模块与功能模块之间的相互调用,如果在使用的时候直接导头引用,做模块间的随意跳转,这样会产生很多耦合与依赖,而我们构建路由的目的,就是要去掉这些耦合,做到模块间互不依赖,不相影响。

先看看目前项目的路由构建:

这里写图片描述

下面开始一步一步地构建路由

一、路由注册

这里写图片描述

// 路由的发起+ (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options {    if ([url.absoluteString containsString:kOrderApplicationScheme]){        return [[JLRoutes routesForScheme:kOrderApplicationScheme] routeURL:url];    }    return NO;}// 路由的注册+ (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [[JLRoutes routesForScheme:kOrderApplicationScheme] addRoute:@"order/puchase" handler:^BOOL(NSDictionary<NSString *,id> * _Nonnull parameters) {        LBOrderWorkbenchPageViewController *vc= [[LBOrderWorkbenchPageViewController alloc] init];        [[UIApplication getCurrentViewController].navigationController pushViewController:vc animated:YES];        return YES;    }];    [[JLRoutes routesForScheme:kOrderApplicationScheme] addRoute:@"order/supply" handler:^BOOL(NSDictionary<NSString *,id> * _Nonnull parameters) {        LBSupplyWorkbenchPageViewController *vc= [[LBSupplyWorkbenchPageViewController alloc] init];        [[UIApplication getCurrentViewController].navigationController pushViewController:vc animated:YES];        return YES;    }];    return NO;}

这里写图片描述

二、路由的发起

#define LBOrderOpen(n) NSString *url = [kOrderApplicationScheme stringByAppendingString:n];\[[UIApplication sharedApplication]openURL:[NSURL URLWithString:url]];\
        case 1:        {            // 采购            LBOrderOpen(@"order/puchase");        }            break;                case 5:        {            // 供应            LBOrderOpen(@"order/supply");        }            break;

三、中心调度

在项目的AppDelegate里面进行设置注册与发起路由之后的调度

    // 设置注册- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [LBBeeApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBUserApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBHomeApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBPayApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBResourceApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBShareApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBUnionNumberApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBRecruitApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBMessageApplicationLifeCycle application:application didFinishLaunchingWithOptions:launchOptions];    [LBOrderApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBCategoryApplication application:application didFinishLaunchingWithOptions:launchOptions];    [LBTenderApplication application:application didFinishLaunchingWithOptions:launchOptions];    ...    return YES;}   // 中心调度   - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{    BOOL result;    result = [LBUserApplication application:app openURL:url options:options];    result = result ? :[LBBeeApplication application:app openURL:url options:options];    result = result ? :[LBResourceApplication application:app openURL:url options:options];    result = result ? :[LBShareApplication application:app openURL:url options:options];    result = result ? :[LBUnionNumberApplication application:app openURL:url options:options];    result = result ? :[LBOrderApplication application:app openURL:url options:options];    result = result ? :[LBRecruitApplication application:app openURL:url options:options];    result = result ? :[LBCategoryApplication application:app openURL:url options:options];    result = result ? :[LBTenderApplication application:app openURL:url options:options];    result = result ? :[LBHomeApplication application:app openURL:url options:options];    result = result ? :[LBPayApplication application:app openURL:url options:options];    if (!result) {        // url没人处理,则处理其他非业务模块的url    }    return result;}

四、传参与回调

我们在做路由的时候,经常会碰到需要传值与返参的操作:

  • 入参
LBOrderOpen(@"order/puchase/1001/5001");
 [[JLRoutes routesForScheme:kOrderApplicationScheme] addRoute:@"order/puchase/:bsId/:bsCode" handler:^BOOL(NSDictionary<NSString *,id> * _Nonnull parameters) {        LBOrderWorkbenchPageViewController *vc= [[LBOrderWorkbenchPageViewController alloc] init];        vc.bsId = parameters[@"bsId"];        vc.bsCode = parameters[@"bsCode"];        [[UIApplication getCurrentViewController].navigationController pushViewController:vc animated:YES];        return YES;    }];
  • 回调
[LBCategoryApplication openURL:@"category/selected/5/1/0" callBack:^(NSArray<NSDictionary *> *resultArray) {}];
+ (void)openURL:(NSString *)urlStr callBack:(LBCategoryApplicationCallBack)callBack{    [[self shareApplication] setCallBack:callBack];    LBCategoryOpen(urlStr);}

这里介绍的是一种思路,当然肯定有更好的思路去做这件事,我们可以进行再探讨,毕竟任何项目的构建都会不断的在完善。

注:

  1. 模块间所有供外部使用的功能和页面,都应该制作成路由
  2. 依赖关系是路由中需要重点考虑的,写代码时降低耦合性,可以使项目间的调度变得清晰
  3. 路由集成的思想可以仿照写SDK,比如一个公司有几个app,写一个支付中心或者是消息IM推送中心,它可以无条件的使用在不用的app当中
  4. 集成路由的前提还是模块化完成,将组件写成Spec私有库就是模块化前有效的工作

end

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃鸡听的脚步声距离太近怎么办 检票时车票丢了怎么办 高铁出站没检票怎么办 高铁来不及取票怎么办 被发现假的增值税发票怎么办 高铁票身份证验证失败怎么办 网上订的火车票查不到怎么办 已经参加工作想学个本科证怎么办 火车晚点耽误下一趟列车怎么办 门外装监控没有预留电线怎么办 框架柱主筋柱顶预留长度不够怎么办 遇到很嚣张的人怎么办 在地板砖上铺木地板卧室门怎么办 宝宝打预防针的本子丢了怎么办 宝宝打预防针本子丢了怎么办 打疫苗的本子丢了怎么办 麦客收割机麦秸里加麦粒怎么办 高铁乘务员身高不够怎么办 坐火车买到站票怎么办 买上车补票原票怎么办? 买的商务座补票怎么办 12306账号被别人登录怎么办 飞机不提供餐食怎么办 12306退票支付宝失败怎么办 12306重复支付怎么办支付宝 支付宝登的12306账号怎么办 没买儿童高铁票怎么办 网上订的机票怎么办托运 半夜买高铁票不出票怎么办 轻轨少买了一站怎么办 高铁火车票丢了怎么办 如果高铁票丢了怎么办 高铁票丢了怎么办 报销 高铁如果没赶上怎么办 高铁管家待核验怎么办 动车没有票了怎么办 12306取消订单3次怎么办 【12306取消订单3次怎么办】 火车票取消订单3次怎么办 12306收不到验证码怎么办 安逸花验证码次数限制怎么办