APP设计模式多种多样,从最初的MVC到MVVM,再到MVP,VIPER等。愈来愈多的设计模式被开发出来并得以应用,但不论咱们用到哪一种设计模式,只须要记住高内聚、低耦合那边是好的设计模式。在这里笔者整理了一份demo以帮助你们更好的理解Swift版路由机制的设计html
笔者了解到最开始分享路由机制的文章是由蘑菇街团队提供连接,其利用url注册来进行界面推出和传值。随后某位大神吐槽其机制有问题连接。在这里笔者也开始思考过这个问题,并从他们的思路中得出了适合本身的路由机制设计。路由机制原理、优势等信息网上有太多的资料可供参考,笔者不在这里赘述。下面就为你们介绍笔者的路由机制设计方式git
笔者以为路由机制的设计主要涉及到两点问题github
界面推出笔者选择了最为简单直接的一种方式,直接经过类名肯定须要推出的控制器界面。再由当前控制器选择进行何种方式的界面推出。在OC中能够直接经过类名转化为class并生成控制器,但在Swift中因为多了命名空间的缘由须要由空间名+类名的方式来生成。具体代码以下: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?) //用于反向传值 }
为了保证注册后控制器不被通讯管理器强引用,中间使用代理类进行桥接,以便控制器能够正常析构,在反注册后就移除中间代理类app
class BaseVcProxy: NSObject { weak var vc:BQRouterCommProtocol? var notifiArr:[Notification.Name] = [] init(vc: BQRouterCommProtocol) { self.vc = vc super.init() } }
最后进行通讯管理post
这里模仿通知中心的方式来进行通讯管理 //注册(重复注册无效) 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)
通讯管理器关键代码以下:url
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进行梳理spa
此路由机制的设计相对来讲比较简单,却也是路由机制的主干部分。若是想要丰富细化,仍有不少细节可处理。这个就看你们项目的实际需求了。在笔者看来路由机制其实能够做为一种架构设计来讲,具体到控制其中又能够分为各类设计模式了。但愿这篇文章能让你们了解到Swift路由设计的方式。若有任何错误之处欢迎指正!