NKRouter
它是什么?
NKRouter 是一个强大的基于 URL 路由的高效库,具有基于块的简单和高级可操作会话 API。它旨在使处理应用中复杂的 URL 方案变得非常容易。NKRouter 具有更高的效率和更好的匹配精度。
基于匹配而不是遍历触发操作。
使用
DFS
和DLR
非递归 算法作为匹配算法。
中文说明
安装
- 使用 CocoaPods:只需将此行添加到您的
Podfile
pod 'NKRouter'
- 手动:将
NKRouter
文件夹添加到您的项目中
需求
NKRouter 需要 iOS 8.0 或更高版本。
基本用法
注册URL操作
- (void)registerUrl {
[[NKRouter globalRouter] registerUrlPath:@"app/home/view" handler:^(NSDictionary * _Nullable parameters) {
// Do what you want...
}];
}
使用URL路由触发URL操作
- (void)routeUrl {
[[NKRouter globalRouter] routeUrl:@"app/home/view" completionHandler:^(NKRouterResponse * _Nonnull response) {
// called when routing finished
// you can check this url routing status here to find out if this routing is succeed and get the error message
// you can also get the response object which set by this url routing session/handler.
}];
}
路由器也可以使用自定义方案注册和路由,使用 [NKRouter routerForScheme:@"myScheme"]
或下面提供的简写语法
[NKRouter registerUrl:@"myScheme://host/app/home/view" handler:^(NSDictionary * _Nullable parameters) {
// Do what you want...
}];
[NKRouter routeUrl:@"myScheme://host/app/home/view" completionHandler:^(NKRouterResponse * _Nonnull response) {
// call back when routing finished
}];
注意事项
[NKRouter globalRouter]
会在URL方案为空时使用。- URL的主机不会进行注册或匹配,您可以使用
myScheme:///app/home/view
来忽略主机。
路由参数
触发参数由路由请求和URL查询设置。注意事项:如果路由请求和URL查询中都有键,则会设置键值。
MyExtarInfp *info = MyExtarInfp.new;
NSDictionary *parameters = @{@"info": info, @"name": @"user"};
[NKRouter routeUrl:@"app/account?id=1&name=visitor" parameters:parameters completionHandler:^(NKRouterResponse * _Nonnull response) {
// call back when routing finished
}];
触发的路由获得的参数如下
[NKRouter registerUrl:@"app/account" handler:^(NSDictionary * _Nullable parameters) {
// parameters = @{@"info": info, @"name": @"user", @"id": @"1"};
}];
高级用法
自定义会话操作
NKRouter支持设置带有自定义会话的路由器。会话继承了NKRouterSession
并可以注册覆盖方法sessionRequest:completionHandler:
到路由器。
MySession *mySession = MySession.new;
[[NKRouter globalRouter] registerUrlPath:@"app/home/view" session:mySession];
或
[NKRouter registerUrl:@"sheme://host/app/home/view" session:mySession];
自定义会话的sessionRequest:completionHandler:
方法会在URL路由匹配时被调用。参数
request
请求信息模型,包括requestUrl
、parameters
、matchPath
、matchType
等completionHandler
会话应尽快调用completionHandler
,以通知 URL 路由请求者此操作是否成功,以及响应responseObject
或error
。
@interface MySession : NKRouterSession
@end
@implementation MySession
- (void)sessionRequest:(NKRouterRequest *)request completionHandler:(void (^)(BOOL, NSDictionary * _Nullable, NSError * _Nullable))completionHandler {
// Do what you want here
// get routing info from request
// must call completionHandler once when this operation is finished
}
@end
可选目录
NKRouter 支持使用可选目录设置路由。可选目录可以匹配任一目录。在注册路由时,NKRouter 将注册可选目录 :option
而不是以 :
开始的目录。
例如,URL 注册 app/home/:controller
将注册为 app/home/:option
。
这将匹配类似 app/home/controller
、app/home/user
、app/home/helper
... 的路由 URL,但不能匹配其他目录不匹配的 URL,如 web/home/controller
、app/user/controller
...,也不匹配更多或更少目录的情况,如 app/home
、app/home/controller/view
...
NKRouter 还支持设置多个可选目录,例如 app/home/:controller/:view
(匹配 app/home/controller/view
、app/home/user/info
...)以及可选目录可以设置在任何目录中,如 app/home/:controller/view
(匹配 app/home/controller/view
、app/home/user/view
...)。
[[NKRouter globalRouter] registerUrlPath:@"app/home/:controller/:view" handler:^(NSDictionary * _Nullable parameters) {
// matched `app/home/controller/view`, `app/home/user/info` ...
}];
通配符
NKRouter 支持设置带有通配符 *
的路由。通配符必须设置在 URL 的末尾目录。这将匹配路由 URL 末尾的任意数量的路径组件。
例如,以下路由将触发以 wildcard/
开头的任何 URL(如 wildcard/
、wildcard/view
、wildcard/view/subview
...),但不会触发类似 home/view
的 URL。
[[NKRouter globalRouter] registerUrlPath:@"wildcard/*" handler:^(NSDictionary * _Nullable parameters) {
// matched wildcard,wildcard/view, wildcard/view/subview...
}];
匹配算法
算法概述
- 匹配算法使用
DFS
和DLR
的非递归算法。 - URL 路由请求将根据最精确的 URL 路由触发 一次。
算法详情
NKRouter匹配最精确的URL路由。
- 首先路由器匹配相同的目录,如果没有匹配到,则继续匹配下一个目录。
- 否则路由器将依次匹配可选目录,如果匹配到则继续匹配下一个目录。
- 如果没有找到对应的目录则返回上一个目录。
- 最后,匹配到整个路径的路由会执行。
例如,URL路由请求app/home/view
将会依次触发以下注册的URL
app/home/view
app/home/:option
app/:option/view
app/:option/:option
:option/home/view
:option/home/:option
:option/:option/view
:option/:option/:option
如果注册的URL中找不到匹配项,将匹配包含通配符的路由。通配符的匹配算法类似
app/home/view/*
app/home/:option/*
app/home/*
app/:option/*
app/*
:option/*
*
如果既没有匹配到路由也没有通配符,将触发未定义会话
。
最后,如果上述所有路由都不存在,将使用无效响应参数调用URL路由的completionHandler
。