iOS中基于协议的路由设计

2020 年 2 月 12 日

iOS中基于协议的路由设计

前段时间对我们自己的 App 做了结构上的重构,抛弃了之前的简单的 MVC 开发模式,原因是随着 App 的业务线越来越多,单个页面的功能越来越复杂,MVC 开发模式就导致整个 Controller-layer 的代码越来越多,这次仅讲一下重构中的 Router 模块。


使用路由模式可以解决我们项目中页面与页面之间的耦合(因为我们 App 是视图生命周期作为驱动,所以这里说是页面,实际是控制器层),因为一个页面功能太多就会引入过多的类。往往造成 import 过多,不好管理。而且 iOS 中执行界面跳转的时候,很容易产生模块间的耦合。


iOS 执行界面跳转的时候,代码如下:


col 1col 2
1[firstViewController.navigationController pushViewController:destinationViewController];


如果在 firstViewController 里面直接引入头文件就会导致模块间的耦合。我们这里就需要路由模块去解决类似的问题。我们的设计是每个模块都有自己的路由管理,路由主要职责应该有:


  • 管理模块内部跳转。

  • 声明模块的对外接口

  • 声明模块的依赖


模块间的跳转




这种设计是松耦合的,我们搜寻的模块可以随时被相同功能的模块替换,这样我们就实现了两个模块的解耦。


目前路由的设计限于以下几种:


  • 字符串标识对应界面,例如URL Router

  • 利用Object-C特性,直接调用目的模块的方法

  • 用protocol来和某个界面进行匹配


URL Router


目前绝大多数的路由是由字符串来打开某个页面,代码大概如下:


col 1col 2


1


2


3


4


5 | //注册某个页面在路由的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




这种路由也是我们采用的路由模式,代码如下:


col 1col 2
1id<***ServiceProtocol> service = [[ProtocolRouter shareInstance] findService:@protocol(***service)];


这种设计方案安全性比较高,在编译阶段就可以检测出问题,更适合于 swift 的设计思想,任何模块都可以使用,包括功能模块,不仅仅局限于 UI 模块。此种方案就会缺少相应的动态性,不过可以做一层 URL Router 的 Adapter 层专门用于动态性的需求。


基于 Protocol 的设计方案不会引起耦合,我们可以轻易替换掉相同功能的目的模块,这种方案也适用于各种解耦,例如 Appdelegate 的解耦。


以上就是我们在程序中实行组件化的一步,随着 App 容量的增大,组件化是必不可少的一步,它可以让我们的 App 更规范,模块的重用性更高。


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/200


2020 年 2 月 12 日 15:2773

评论

发布
暂无评论
发现更多内容

游戏发行中学到的重要经验(严肃长文)

谢锐 | Frozen

独立开发者 游戏开发 游戏出海 移动互联网

香港科技大学与OSL海科签订无毒海洋防污技术独家授权协议

极客编

我画了35张图就是为了让你深入 AQS

一枝花算不算浪漫

AQS jdk源码

经历过疫情,你懂得了什么

Winann

疫情 个人成长 生活 成长

初次见面

KAMI

谈谈双亲委派模型的第四次破坏-模块化

寻筝

Java JVM

大一到大三总结

迷羊

学习 经历

Leetcode 556. Next Greater Element III

隔壁小王

算法

Binlog2sql恢复误删除的数据

一个有志气的DB

MySQL 安全 数据

决战下半场:小程序技术助力金融APP重回C位

fino星君

小程序 数字化转型 app重构

看完这篇HTTP,跟面试官扯皮就没问题了

cxuan

https okhttp

elasticsearch源码解析(一)——restapi

罗琦

elasticsearch 源码分析 RESTful

零基础如何学架构

兆熊

架构

高仿瑞幸小程序 09 云数据库初体验

曾伟@喵先森

小程序 微信小程序 前端 移动

看完这篇,你也是字符编码大神(ASCII、Unicode、UTF-8、UTF-16、UTF-32)

Meandni

Java 面试 Unicode utf-8 utf-16

Web3极客日报#140

谢锐 | Frozen

区块链 独立开发者 技术社区 Rebase Web3 Daily

为什么软件开发很难外包

刘华Kenneth

外包 DevOps 风险 背锅

“四个维度” 讲明白什么是微服务!

攀岩飞鱼

微服务架构 单体系统 架构设计 团队组织 康威定律

游戏夜读 | Scikit-learn的2018自述

game1night

JVM源码分析之Object.wait/notify实现

猿灯塔

JVM

阿里巴巴泰山版《Java 开发者手册》,也是一份防坑指南

古时的风筝

Java规范 Java开发手册

战略懒惰有多可怕

Neco.W

创业 重新理解创业 初创公司

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (八)好单元测试的特质

编程道与术

Java 编程 软件测试 TDD 单元测试

一篇文章搞定Java处理Excel的各种疑难杂症

知春秋

Java Excel POI

浅析 - CocoaLumberjack 3.6 之 DatabaseLogger

Edmond

ios sqlite log4j CocoaLumberjack DDLog

找一个更好的理由

史方远

职场 成长 工作

如何在 Mac 上优雅的截图和录屏

Winann

macos 效率 效率工具 Mac

Azure App 部署Django 和 PostgrSQL

yann [扬] :曹同学

Python azure

记一次MHA切换故障踩的坑

一个有志气的DB

MySQL 高可用 复制 主从同步 故障分析

谈谈控制感(4):损失的后果很严重

史方远

职场 心理 成长

MySQL安全-审计

一个有志气的DB

安全 MySQ

iOS中基于协议的路由设计-InfoQ