主流方式
- router
- protocol-class
- target-action
上面三种只是实现方式不同而已,解耦的本质都是利用字符串,绕过编译器检查。
router
代表 MGJRouter、JLRouter 等,核心的原理就是利用字符串执行对应的 block,而这个 block 的参数是通过路由解析完成的。
// 可以在 load 中注册
Router.register("aaa", { params in
let vc = VC()
vc.xxx = params["xxx"]
push(vc)
})
// open 时会把后面的 xxx=abc 解析出来,传到 block 中作为 params
Router.open("aaa?xxx=abc")
target-action
代表 CTMediator,本质就是通过反射拿到 vc,然后直接 push 即可。配合 category,也不需要修改 CTMediator 类。当然这个传参就非常简单了,想怎么传就怎么传。
// 调用方
let vc = CTMediator.shared.action(params)
push(vc)
// 被调用方
extension CTMediator {
func action(params) {
return self.preformTarget(...)
}
}
由于这个是使用 runtime 进行反射,所以并不需要提前建立映射关系。
procotol class
代表 BeeHive,本质就是通过 protocol 和 vc 建立映射,通过 protocol 拿到 vc。
我们的路由
接近于第一种
- 通过 url 解析出 class 和 params,构造出 request
- 通过 request 构造出 response
- 通过 response 进行跳转
openURL(_ url: String, nativeParams: [String: Any]?) {
// 通过 URL 构造一个 request
var (request, class) = parseURL(url)
// 通过 request 构造出一个 response
// 如果 class 是 vc 则进行跳转,先构造一下: vc.init(request)
push(vc)
// 如果 class 是一个类,处理完成这个里面的逻辑再进行跳转
}