IOS开发入门之iOS项目组件化解耦
白羽 2018-11-23 来源 :网络 阅读 1640 评论 0

摘要:本文将带你了解IOS开发入门iOS项目组件化解耦,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS项目组件化解耦,希望本文对大家学IOS有所帮助。



        

最近给公司的一个iOS项目进行组件化解耦。本身项目早期开发就不是很规范,而且刚刚开始熟悉这个项目对业务方面也不是很熟悉所以并没有对所有的模块进行组件化。而且组件化解耦后还存在一些问题在文章中都会写出来。
原理和蘑菇街 App 的组件化之路类似,但是也有一些不同并没有加入「组件A」要调用「组件B」的某个方法这种业务场景。所有组件化的模块都是「组件A」要调用「组件B」的这种情况。「组件A」与「组件B」之间是透明的。

为何要对项目组件化

对每个模块间相互调用解耦统一wap与本地调用 

首先说一下组件化带来的最大好处就是给每个模块间解耦。之前模块间调用不得不相互引用,这就导致了各个模块间相互依赖。想象一种场景:A,B,C,D是四个VC,四个VC之间是这样的关系,A与B相互跳转、B与C相互跳转、D与A,B相互跳转。它们之间的关系如下图:

而组件化在项目中引入了Mediator对象与Action对象,引入这两个对象后,A,B,C,D之间的关系如下图:

<喎?"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPtXi0fm94bm5vs263Mfls/7By7b4x9Kyu7nctuDJ2bj21+m8/r3hubm2vMrH1eK49tH519Oho8/Cw+a74cu1w/c8Y29kZT5NZWRpYXRvcrbUz/PT6zxjb2RlPkFjdGlvbrbUz/O1xMq1z9ahozwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8aHIgLz4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPrbU09rSu7j2PGNvZGU+QXBwwLTLtbHYsru/ycPitcS74dPQPGNvZGU+d2Fw0rPD5rX308M8Y29kZT5OYXRpdmW1xLmmxNyho82ouf08Y29kZT5VUkzXorLhyrXP1tfpvP67r7e9sLi/ydLUyrXP1s2s0ru49jxjb2RlPlVSTLy0v8nS1NTasb612LX308PX6bz+0rK/ydLU1No8Y29kZT53YXDSs8PmtffTw9fpvP6ho9Xi0fnUrbG+0qrU2sG9tKbNrMqxtKbA7bXEwt+8rc2z0ru3xdTawcs8Y29kZT5NZWRpYXRvcrbUz/PW0LSmwO2hozxiciAvPg0KtbHIu9Xi0fnX9tPQ0ru49sixteO+zcrHyOe5+zxjb2RlPndhcNKzw+a199PD0+uxvrXYtffTw82s0ru49sSjv+nQ6NKq1/ayu82stcS0psDtyrHO3reox/i31srH1NrExMDvtffTw7XEo6zS8s6qtrzKx82ouf3Su9H5tcQ8Y29kZT5VUkzAtLX308O1xKGjxL/HsNTaztLTxbuvtcTP7sS/1tCyosO709DV4tH5tcTQ6MfzoaPL+dLUtbHHsLXEt72wuMrHv8nQ0LXEoaPI57n71ea1xNKqx/i31rXEu7C/ydLUzai5/bSrtd2yu82stcSyzsr9wLTIt7aoyse008TEwO+3osbwtcS199PDoaM8L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPGhyIC8+DQo8aDIgaWQ9"组件化方案的实现">组件化方案的实现

通过程序启动时注册URL来实现组件化,URL注册用通过JLRoutes实现的。
具体使用如下:


   

<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

 

    JLRoutes *routes = [JLRoutes routesForScheme:scheme_url];

 

    [routes addRoute: LSYKey1 handler:^BOOL(NSDictionary<nsstring nsstring=""> * _Nonnull parameters) {

        //要处理的逻辑

        return YES; //判断返回值来决定是否执行该处代码

    }];

}

</nsstring></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

   

在上面的代码中scheme_url是app自定义的协议,LSYKey1是URL的路径,parameters是URL的参数。通过程序启动初始化JLRoutes对象,并注册不同的URL,当尝试打开scheme_url协议的URL时就会执行对应注册路径下block内的代码。


   

<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation   //当程序尝试打开URL或者处理完从其它应用返回时会调用该方法 (不同版本的系统需要实现的方法不同)

{   

    if ([url.scheme isEqualToString:scheme_url]) {

       return  [JLRoutes routeURL:url];

    }

    return YES;

}</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

   

如果尝试打开scheme_url://LSYKey1?oid=123&amount=456这样的url时就会执行上面代码中注册的block。通过parameters取得该url的参数。


   

<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>    JLRoutes *routes = [JLRoutes routesForScheme:scheme_url];

 

    [routes addRoute: LSYKey1 handler:^BOOL(NSDictionary<nsstring nsstring=""> * _Nonnull parameters) {

        NSInteger oid = [parameters[@"oid"] integerValue]; //获取url中oid参数

        NSInteger amount = [parameters[@"amount"] integerValue]; //获取url中amount参数

 

        return YES; 

    }];</nsstring></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

   

上面说明如何通过JLRoutes注册URL的,具体组件化解耦是Mediator对象与Action对象配合JLRoutes来实现的。
首先我们需要有一个文件来统一管理本地模块的Key值,这里在ComponentKey.h文件中进行管理

ComponentKey.h


   

<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>#import <foundation foundation.h="">

 

static NSString * const LSYKey1 = @"LSYKey1";

 

static NSString * const LSYKey2 = @"LSYKey2";

 

static NSString * const LSYKey3 = @"LSYKey3";

 

...</foundation></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

   

Mediator对象实现的方法如下:

Mediator.h


   

<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>#import <foundation foundation.h="">

 

@interface Mediator : NSObject

 

/**

 JLRountes注册的url

 */

+(void)componentRegister;

 

/**

 本地通过key打开模块

 

 @param key 模块key

 @param dic 传递的参数

 */

+(void)openComponentForKey:(NSString *)key parameter:(NSDictionary *)dic;

 

/**

 该方法通过运行时的机制让Mediator对象与Action对象解耦并将消息转发给Action对象执行

 

 @param targetName Action对象名

 @param actionName 方法名

 @param params     传递的参数

 */

+(void)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params;

@end</foundation></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

   

Mediator.m


   

<code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code><code>@implementation Mediator

 

 

+(void)componentRegister

{

    JLRoutes *routes = [JLRoutes routesForScheme:scheme_url];

 

    [routes addRoute: LSYKey1 handler:^BOOL(NSDictionary<nsstring nsstring=""> * _Nonnull parameters) {

        [self performTarget:@"Action" action:@"performActionA" params:parameters];

        return YES;

    }];

 

        [routes addRoute: LSYKey2 handler:^BOOL(NSDictionary<nsstring nsstring=""> * _Nonnull parameters) {

        [self performTarget:@"Action" action:@"performActionB" params:parameters];

        return YES;

    }];

 

 

}

+(void)openComponentForKey:(NSString *)key parameter:(NSDictionary *)dic

{

    //将本地调用传入的Key与参数转拼接成url最后通过JLRoutes处理

    if (!key.length) {

        return;

    }

    NSMutableString *urlString = [NSMutableString stringWithString:[NSString stringWithFormat:@"%@://%@",scheme_url,key]];

    [urlString appendString:@"?"];

    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

<div class="line    

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved