iOS中基于协议的路由设计
一、背景
前段时间对我们自己的App做了结构上的重构,抛弃了之前简单的MVC开发模式,原因是随着App的业务线越来越多,单个页面的功能越来越复杂,MVC开发模式导致整个Controller-layer的代码越来越多。本文将分享重构中的Router模块。
使用路由模式可以解决我们项目中页面与页面之间的耦合(因为我们App是视图生命周期作为驱动,所以这里说是页面,实际是控制器层),因为一个页面功能太多就会引入过多的类,往往会造成import过多,不好管理。而且iOS中执行界面跳转的时候,很容易产生模块间的耦合。
iOS执行界面跳转的时候,代码如下:
[firstViewController.navigationController pushViewController:destinationViewController];
如果在firstViewController里面直接引入头文件就会导致模块间的耦合。我们这里就需要路由模块去解决类似的问题。我们的设计是每个模块都有自己的路由管理,路由主要职责应该有:
- 管理模块内部跳转。
- 声明模块的对外接口
- 声明模块的依赖
二、模块间的跳转
这种设计是松耦合的,我们搜寻的模块可以随时被相同功能的模块替换,这样我们就实现了两个模块的解耦。
目前路由的设计限于以下几种:
- 字符串标识对应界面,例如URL Router
- 利用Object-C特性,直接调用目的模块的方法
- 用protocol来和某个界面进行匹配
三、URL Router
目前绝大多数的路由是由字符串来打开某个页面,代码大概如下:
//注册某个页面在路由的url地址 [URLRouter registURL:@“Desination” handler:^(NSDictionary * userDic){ }; //使用路由 [URLRouter openURL:@“app://***Module/Destionation”];
传递一串参数URL就可以进行页面间的跳转,这种方案可以再运行时随时更改路由规则,指向不同的页面,也可以支持多级页面跳转。这种方案有极大的灵活性。
而且此种方案最容易跨平台实现的,iOS, Android,PC都可以按照URL来进行路由。
iOS中可以通过URL Scheme进行进程间的通信,同App外面打开App中的某个页面,此方案可以完美兼容URL Router。
当然这种方案缺点也是很明显的:
第一、基于URL的设计只适合与UI界面,功能性的模块是不能采用这种方案的,所以这种方案只适用于视图驱动的模块。
第二、这种方案维护比较困难,要维护一大批的字符串,还要维护传参。
第三、安全性不高,因为只有在运行时才能检查出错误,类似于swift早期中selector用字符串寻找的问题。
四、Protocol Router
这是我们采用的路由模式,代码如下:
id<***ServiceProtocol> service = [[ProtocolRouter shareInstance] findService:@protocol(***service)];
这种设计方案安全性比较高,在编译阶段就可以检测出问题,更适合于swift的设计思想,任何模块都可以使用,包括功能模块,不仅仅局限于UI模块。此种方案就会缺少相应的动态性,不过可以做一层URL Router的Adapter层专门用于动态性的需求。
基于Protocol的设计方案不会引起耦合,我们可以轻易替换掉相同功能的目的模块,这种方案也适用于各种解耦,例如Appdelegate的解耦。
以上就是我们在程序中实行组件化的一步,随着App容量的增大,组件化是必不可少的一步,它可以让我们的App更规范,模块的重用性更高。
作者:崔晓迪
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Flutter 54: 图解基本生命周期
小菜使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天小菜分几个场景学习一下 Flutter 的生命周期; 小菜借助 WidgetsBinding 通过观察和监听 didChangeAppLifecycleState 来分析生命周期事件,与 Android 原生类似; 基本场景 1. 初始化 initState -> didChangeDependencies -> build 2. 页面数据更新 小菜尝试页面按钮点击或弹框处理,均不会涉及生命周期变化,只是在 build 更新 Widget 资源;但是若进行 热重载 生命周期如下: reassemble -> didUpdateWidget -> build 3. 横竖屏切换 didUpdateWidget -> build -> didUpdateWidget -> build (执行两次) 4. 切至后台 didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLif...
- 下一篇
iOS开发如何避免安全隐患
现在很多iOS的APP没有做任何的安全防范措施,导致存在很多安全隐患和事故,今天我们来聊聊iOS开发人员平时怎么做才更安全。 一、网络方面 用抓包工具可以抓取手机通信接口的数据。以Charles为例,用Charles可以获取http的所有明文数据,配置好它的证书后就可以模拟中间人攻击,获取https加密前的明文数据。 1.1 中间人攻击 先简要地说下什么是中间人攻击: ①客户端:“我是客户端,给我你的公钥” -> 服务端(被中间人截获)。 所以现在是: 客户端->中间人 ②然后中间人把消息转给服务端,也就是: 中间人->服务端 ③服务端把带有公钥的信息发送给客户端,但是被中间截获。所以是: 服务端-[服务端的公钥] ->中间人 ④中间人把服务端的公钥替换成自己的公钥,发送给客户端,声称是服务端的公钥: 中间人-[中间人的公钥] ->客户端 ⑤客户端用得到的公钥加密,实际是用中间人的公钥进行加密,所以中间人可以用自己的私钥解密,获取原始数据,然后再用服务端的公钥对原始数据(或者修改原始数据内容)加密后发送给服务端。 这样中间人就可以获取到双方的通信数据,并可...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS关闭SELinux安全模块
- CentOS6,7,8上安装Nginx,支持https2.0的开启