ACRouter
ACRouter 造轮子的由来
现在已经有很成熟的Router工具, 如 JLRoutes 与 MGJRouter, 它们的star和使用者都不少, 那么我为什么还要自己造轮子呢?
- 这些都是用OC写的, 对于一个纯Swift项目, 总感觉哪不对劲
- 这些第三方都有自己的一个侧重点, 如JLRoutes更侧重于URL的解析, 而MGJRouter则侧重于解析后的使用, 确切来说后者是基于前者并在自己的使用场景下开发完成的. 而对于ACRouter的功能侧重点又与前两者不一样
- 抱着学习的心态, 对于大部分coder造轮子的初衷就是学习, 并且能使学习的成果产出并被大家认可
Router的定义: 路由是把信息从源穿过网络传递到目的的行为
ACRouter并不是要实现一个能将所有信息转化后传递到目的地的工具, 而只是一个简单的页面路由, 希望项目中的页面跳转不再需要彼此相互依赖, 只需要像Web一般通过一个特殊的URL就能完成页面间的跳转.
页面路由其实是做项目组件化的一个衍生物, 组件化需要将整个项目的各个模块进行解耦, 而对于模块间页面相互跳转的解耦, 如今最佳的解决方案就是页面路由.
页面路由并不是一个新的概念, 早在几年前就已经在实际App项目中使用了, 但当时这并不是大家的痛点, 所以并没有兴起. 而如今手机App的功能越来越复杂多样. 之前的一个Target, 一个Module的项目结构已经无法支持其快速发展与迭代了.
个人对Router的理解并不是解耦, 而是转移耦合. 将部分耦合转移到模块内部或由一个公共的工具统一管理, 实现在模块外部来看完成了模块间的解耦的假象
. 尽管这是一个解耦的假象
, 但是对于模块外的使用确实带来了不少的便利.
由于需要转移耦合, 做到高内聚低耦合, 因此必不可少的需要不少胶水代码, 使其”粘”在Router的这根主线上. 所以总体看来使用Router并不会带来明显的代码量减少, 但是对于项目结构的管理与多模块的并行开发带来了不少的优势, 但这种优势对于小项目可能无法体现, 但是对于大项目组件化已经成为了必不可少的一部分.
ACRouter的大致流程: 将一个Block与一个URL进行绑定, request 对应的URL的同时执行与其绑定的Block
总体流程
快速使用
- 需要路由的控制器遵守协议
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
}
}
- 注册路由
ACRouter.addRouter("AA://bb/cc/:p1", classString: "CustomViewController")
- 通过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: )
自定义使用
- 添加路由, 自己配置优先级和HandleBlock
//注册的路由将按优先级逆序排序
ACRouter.addRouter(patternString: priority: handle: )
- 请求URL
//返回匹配的路由与所有解析出来的参数
ACRouter.requestURL(urlString: userInfo: )
Todo list
AddInterceptor
for routerAdd Test for router- Add
openURL
failed action - Add
relocation
-
openURL
not only support Viewcontroller jumping
具体文档稍后更新, 感兴趣的小伙伴可以留意ACRouter Github, 小编将同步更新.
未完待续....