iOS 路由研究

166 阅读1分钟

主流方式

  • 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。

我们的路由

接近于第一种

  1. 通过 url 解析出 class 和 params,构造出 request
  2. 通过 request 构造出 response
  3. 通过 response 进行跳转
openURL(_ url: String, nativeParams: [String: Any]?) {
    // 通过 URL 构造一个 request
    var (request, class) = parseURL(url)
    // 通过 request 构造出一个 response
    // 如果 class 是 vc 则进行跳转,先构造一下: vc.init(request)
    push(vc)
    // 如果 class 是一个类,处理完成这个里面的逻辑再进行跳转
}