Swift 路由机制设计
设计模式
APP设计模式多种多样,从最初的MVC到MVVM,再到MVP,VIPER等。越来越多的设计模式被开发出来并得以应用,但不论我们用到哪种设计模式,只需要记住高内聚、低耦合那边是好的设计模式。在这里笔者整理了一份demo以帮助大家更好的理解Swift版路由机制的设计
APP路由机制出现
笔者了解到最开始分享路由机制的文章是由蘑菇街团队提供链接,其利用url注册来进行界面推出和传值。随后某位大神吐槽其机制有问题链接。在这里笔者也开始思考过这个问题,并从他们的思路中得出了适合自己的路由机制设计。路由机制原理、优点等信息网上有太多的资料可供参考,笔者不在这里赘述。下面就为大家介绍笔者的路由机制设计方式
路由机制设计原理
笔者觉得路由机制的设计主要涉及到两点问题
- 推出界面(确定的目标控制器)
- 数据传输(正向传值和反向传值)
推出界面
界面推出笔者选择了最为简单直接的一种方式,直接通过类名确定需要推出的控制器界面。再由当前控制器选择进行何种方式的界面推出。在OC中可以直接通过类名转化为class并生成控制器,但在Swift中由于多了命名空间的原因需要由空间名+类名的方式来生成。具体代码如下:
//这里的BQRouterCommProtocol是为数据传输准备的协议,会在数据传输部分进行说明
static func loadVc<T: BaseVc>(vcName:String, spaceName: String? = nil) -> T where T:BQRouterCommProtocol {
var clsName = ""
if let space = spaceName{
clsName = space + "." + vcName
}else {
let spaceName = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String
clsName = spaceName! + "." + vcName
}
let cls = NSClassFromString(clsName) as? BaseVc.Type
let vc = cls?.init()
if let valueVc = vc {
return valueVc as! T
}else {
//当无法生成对应的控制器时,返回一个默认的错误控制器用以说明
return ErrorVc() as! T
}
}
数据传输
当要推出的控制器视图有了之后,便要考虑数据传输问题,首先是正向传值,这种比较简单直接略过,我们需要主要思考的是反向传值方式,为了做到解耦,笔者最开始思考的方式是直接使用NotificationCenter。考虑到其使用时效率问题(其本质原理是通过KVO方式去进行操作),因此笔者模拟通知中心设计了一个路由通信管理器。
通信管理器设计思路
- 通信管理器注册进行通信的控制器
- 通信管理器传输数据到可接受的控制器
- 当控制器释放时,从通信管理器中反注册
先设计通信协议,目的是保证数据传输方式的统一和规范
protocol BQRouterCommProtocol:NSObjectProtocol {
var removeIndex: Int { get set } //用于反注册使用,初始数值小于0
func loadVcInfo(params:Any) //用于正向传值
func reciveRouterComm(name:Notification.Name, params:Any?) //用于反向传值
}
为了保证注册后控制器不被通信管理器强引用,中间使用代理类进行桥接,以便控制器可以正常析构,在反注册后就移除中间代理类
class BaseVcProxy: NSObject {
weak var vc:BQRouterCommProtocol?
var notifiArr:[Notification.Name] = []
init(vc: BQRouterCommProtocol) {
self.vc = vc
super.init()
}
}
最后进行通信管理
这里模仿通知中心的方式来进行通信管理
//注册(重复注册无效)
class public func addRouterComm(names:Notification.Name..., target: BQRouterCommProtocol)
//发送数据
class public func postRouterComm(name:Notification.Name, params:Any? = nil)
//反注册
class public func romveRouterComm(target: BQRouterCommProtocol)
通信管理器关键代码如下:
private func addComm(names:[Notification.Name], target: BQRouterCommProtocol) {
for weakVc in self.commObjcs {
if let vc = weakVc.vc {
if (vc as! UIViewController) == (target as! UIViewController){
return
}
}
}
let weakVc = BaseVcProxy(vc: target)
weakVc.notifiArr.append(contentsOf: names)
self.commObjcs.append(weakVc)
target.removeIndex = self.commObjcs.index(of: weakVc)!
}
private func postComm(name:Notification.Name, params:Any?) {
for weakVc in self.commObjcs {
if let vc = weakVc.vc {
if weakVc.notifiArr.contains(name) {
vc.reciveRouterComm(name: name, params: params)
}
}
}
}
private func removeComm(target: BQRouterCommProtocol) {
if target.removeIndex >= 0 {
self.commObjcs.remove(at: target.removeIndex)
}
}
到这里大家应该都看出笔者路由设计的概貌了,如还是不太清楚,建议对照demo进行梳理
后记
此路由机制的设计相对来说比较简单,却也是路由机制的主干部分。如果想要丰富细化,仍有很多细节可处理。这个就看大家项目的实际需求了。在笔者看来路由机制其实可以作为一种架构设计来说,具体到控制其中又可以分为各种设计模式了。希望这篇文章能让大家了解到Swift路由设计的方式。如有任何错误之处欢迎指正!
Swift 路由机制设计的更多相关文章
- MVC5之路由机制
---恢复内容开始--- MVC是一种模式,是基于asp.net上的一种设计.路由机制不属于MVC,路由机制属于asp.net.因此,mvc的路由机制就是基于asp.net路由机制上的一种“自定制”. ...
- Linux x86_64 APIC中断路由机制分析
不同CPU体系间的中断控制器工作原理有较大差异,本文是<Linux mips64r2 PCI中断路由机制分析>的姊妹篇,主要分析Broadwell-DE X86_64 APIC中断路由原理 ...
- C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分. 它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home/Index,那么你只需要配置一个默认路由就能简单搞定: ...
- Linux mips64r2 PCI中断路由机制分析
Linux mips64r2 PCI中断路由机制分析 本文主要分析mips64r2 PCI设备中断路由原理和irq号分配实现方法,并尝试回答如下问题: PCI设备驱动中断注册(request_irq) ...
- 走进AngularJs(八) ng的路由机制
在谈路由机制前有必要先提一下现在比较流行的单页面应用,就是所谓的single page APP.为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而a ...
- MVC路由机制
按照传统,在很多Web框架中(如经典的ASP.JSP.PHP.ASP.NET等之类的框架),URL代表的是磁盘上的物理文件.例如,当看到请求http://example.com/albums/li ...
- typecho路由机制详解
本文介绍的是typecho的路由机制,引自 不烦恼路由机制是typecho的核心,有很多功能都是基于路由功能设计的,理解并熟悉TE的路由机制将非常有助于插件的开发. 完整的路由表如下: array ( ...
- asp.net MVC 路由机制
1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...
- asp.net MVC 路由机制 Route
1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...
随机推荐
- 我对Stub和Mock的理解
介绍 使用测试驱动开发大半年了,我还是对Stub和Mock的认识比较模糊,没有进行系统整理. 今天查阅了相关资料,觉得写得很不错,所以我试图在博文中对资料进行整理一下,再加上一些自己的观点. 本文是目 ...
- VR的发展历程-VR全景智慧城市
从1962年有第一台VR开始,到2014年Oculus被Facebook收购为止,VR经历了一个非常漫长的过程.从鲜为人知,到被广泛认识,逐渐走进我们生活.这就是VR形成的时代.在这个时代里,VR设备 ...
- win10下使用nodejs安装及webstorm创建express项目的指导
title: win10下使用nodejs安装 win10下使用nodejs安装及webstorm创建express项目的指导 windows下nvm的安装 熟悉linux下nodejs开发的朋友应该 ...
- Java 8 Learn Notes
Main reference: [1] http://winterbe.com/posts/2014/03/16/java-8-tutorial/ [2] https://plus.google.co ...
- 关于ubuntu的图标创建以及快捷方式打开
//这里个人要添加的的为微信小程序开发工具 1:终端命令: sudo gedit /usr/share/applications/MyChat.desktop 2:修改启动器配置如下: [Deskto ...
- (HTTPS)web 项目如何实现https
HTTPS实际是SSL over HTTP, 该协议通过SSL在发送方把原始数据进行加密,在接收方解密,因此,所传送的数据不容易被网络黑客截获和破解.本文介绍HTTPS的三种实现方法.方法一 静态超链 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...
- Windows下以Local模式调试SparkStreaming的WordCount例子
1.下载Windows版的NetCat https://eternallybored.org/misc/netcat/ 2.启动NetCat nc -l -p 9999 3.将SAPRK_HOME\c ...
- 2-SAT算法
参考blog 参考论文 参考论文 题目 & 题解 裸2-SAT poj3683 poj3207 poj3678 poj3648 2-SAT + 二分法 poj2723 poj2749 hdu3 ...
- mac下sublime text3 安装px转rem插件
本人使用的是os-x系统,即mac系统,每次使用单位rem用其他网页转换很不方便.自己捣腾了一下插件,现在共享给大家 第一步: 先下载插件: https://github.com/narrow-gat ...