页面路由-Swift-ACRouter

ACRouter


ACRouter 造轮子的由来

现在已经有很成熟的Router工具, 如 JLRoutes 与 MGJRouter, 它们的star和使用者都不少, 那么我为什么还要自己造轮子呢?

  1. 这些都是用OC写的, 对于一个纯Swift项目, 总感觉哪不对劲
  2. 这些第三方都有自己的一个侧重点, 如JLRoutes更侧重于URL的解析, 而MGJRouter则侧重于解析后的使用, 确切来说后者是基于前者并在自己的使用场景下开发完成的. 而对于ACRouter的功能侧重点又与前两者不一样
  3. 抱着学习的心态, 对于大部分coder造轮子的初衷就是学习, 并且能使学习的成果产出并被大家认可

Router的定义: 路由是把信息从源穿过网络传递到目的的行为

ACRouter并不是要实现一个能将所有信息转化后传递到目的地的工具, 而只是一个简单的页面路由, 希望项目中的页面跳转不再需要彼此相互依赖, 只需要像Web一般通过一个特殊的URL就能完成页面间的跳转.

页面路由其实是做项目组件化的一个衍生物, 组件化需要将整个项目的各个模块进行解耦, 而对于模块间页面相互跳转的解耦, 如今最佳的解决方案就是页面路由.
页面路由并不是一个新的概念, 早在几年前就已经在实际App项目中使用了, 但当时这并不是大家的痛点, 所以并没有兴起. 而如今手机App的功能越来越复杂多样. 之前的一个Target, 一个Module的项目结构已经无法支持其快速发展与迭代了.

个人对Router的理解并不是解耦, 而是转移耦合. 将部分耦合转移到模块内部或由一个公共的工具统一管理, 实现在模块外部来看完成了模块间的解耦的假象. 尽管这是一个解耦的假象, 但是对于模块外的使用确实带来了不少的便利.

由于需要转移耦合, 做到高内聚低耦合, 因此必不可少的需要不少胶水代码, 使其”粘”在Router的这根主线上. 所以总体看来使用Router并不会带来明显的代码量减少, 但是对于项目结构的管理与多模块的并行开发带来了不少的优势, 但这种优势对于小项目可能无法体现, 但是对于大项目组件化已经成为了必不可少的一部分.

ACRouter的大致流程: 将一个Block与一个URL进行绑定, request 对应的URL的同时执行与其绑定的Block

总体流程

页面路由-Swift-ACRouter_第1张图片
process.jpg

快速使用

  1. 需要路由的控制器遵守协议ACRouterable, 并实现方法registerAction.
class CustomViewController: UIViewController, ACRouterable {
    static func registerAction(info: [String : AnyObject]) -> AnyObject {
        let newInstance = LoginViewController()
        if let title = info["username"] as? String {
            newInstance.title = title
        }
        return newInstance
    }
}
  1. 注册路由
ACRouter.addRouter("AA://bb/cc/:p1", classString: "CustomViewController")
  1. 通过URL打开控制器
ACRouter.openURL("AA://bb/cc/content?value1=testInfo")

便利方法

  • 快速添加路由映射关系
let registerDict = ["AA://bb/cc/:p1" : "CustomViewControllerOne", "AA://ee/ff" : "CustomViewControllerTwo"]
ACRouter.addRouter(registerDict)
  • 快速生成跳转URL
//自动将参数params和jumptype嵌入到注册的URL当中
ACRouter.generate(_ patternString: params:  jumpType: )
  • 检查跳转URL
canOpenURL(_ urlString: )
  • 移除路由
removeRouter(_ patternString: )

自定义使用

  1. 添加路由, 自己配置优先级和HandleBlock
//注册的路由将按优先级逆序排序
ACRouter.addRouter(patternString:  priority: handle: )
  1. 请求URL
//返回匹配的路由与所有解析出来的参数
ACRouter.requestURL(urlString: userInfo: )

Todo list

  • Add Interceptor for router
  • Add Test for router
  • Add openURL failed action
  • Add relocation
  • openURL not only support Viewcontroller jumping

具体文档稍后更新, 感兴趣的小伙伴可以留意ACRouter Github, 小编将同步更新.

未完待续....

你可能感兴趣的:(页面路由-Swift-ACRouter)