暂时没看却需要看的程序员@IT·互联网

谈谈iOS应用架构

2017-03-17  本文已影响112人  我的名字好长好长灬

缘由


最近在新公司做代码重构,每天就是 update 然后 commit 。不说之前的代码写的多么臃肿吧,不说了,嗯那就不说了,来一张图吧。(闲话就扯这么多)

图片源于网络,我只想形容一下坐火车的经历

每天都在学习,新技术新思想上手速度快,理解速度快,做不到这点,你就是码农。

- (void)topicWillAppear:(BOOL)animated;

说起架构我就应该多谢我的“Teacher Kevin”,我记得在某一个星期六,我还在埋头堆代码,突然某Q弹出一个消息:“我写了一个路由,github地址:https://github.com/GithubXWH/KVRouter 记得来捧场哈。😊”。

还给我一个笑脸???调戏我?给你一个😝自己体会吧。

话说回来了,什么是路由?我只知道路由器。难道说要搞网络层?

于是我简书了好多——iOS路由。

认真你就输了,不认真你连输的资格都没有,做不到这点,你就是码农。

真的,有时候认真起来,我就感觉做什么都很顺手。(于是,我从上一家公司辞职了。😄)搜到了很多文章,文章质量也很好,算是醍醐灌顶吧。

- (void)topicDidAppear:(BOOL)animated;

路由这个概念其实我是排斥的,这个名字感觉不怎么靠谱,应该叫URL Redirection。

读代码,就应该读他的写代码的思维,做不到这点,你就是码农。

于是我打开了他们的.h文件,开始啃食,我觉得这些路由都会提供以下的三个方法。


1.提供两种注册方法,URL String 注册/Plist注册;

2.通过ClassName/Class获取某个类的 redirect URL String;

3.打开 redirect URL String (可以传参数,可以选择回调方法);


App启动时实例化各组件模块,然后这些组件向Router注册Url,有些时候不需要实例化,使用class注册。当组件A需要调用组件B时,向Router传递URL,参数跟随URL以GET方式传递,类似openURL。然后由Router负责调度组件B,最后完成任务。

说实话我排斥这种想法的。

- (void)topicDidLoad;

一个偶然的机会我发现了https://casatwy.com/,他(感谢🙏感谢大神)谈到组件化。后来我才知道为什么一个项目需要路由这样的思想。

面向对象:在计算机程序中,我们不能在没有能告知程序期望什么样的属性和动作的蓝图的情况下创建对象。在大部分面向对象的编程语言中,这个蓝图以类的形式出现。类是一种允许我们把对象的属性和动作封装到单个类型中的结构。

在一个项目的主体结构上,必定会分出一些其他的功能,这些功能会由不同的开发团队来实现。显而易见,堆代码肯定是使项目臃肿最快且最好的方法,当然如果你愿意的话。

如果业务有交叉的时候,模块与模块直接的调用会很频繁。

我发现我之前在培训机构学的东西都白学了,白学了,白瞎了一个计算机男。😯

下面我们来看我比较喜欢的一种组件化方案-CTMediator

基于Mediator模式和Target-Action模式的设计,中间采用runtime调用。

组件化设计

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

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

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

- 摘自casatwy.《iOS应用架构谈 组件化方案》

很少的代码,实现了组件化调用,清晰明了,详细介绍移步https://casatwy.com/iOS-Modulization.html,CTMediator Demo,移步https://github.com/casatwy/CTMediator,我建议还是移步,毕竟我还是一只菜鸟。

上一篇下一篇

猜你喜欢

热点阅读