简介
NKRouter是一个功能强大且简单易用的URL路由库。通过匹配到的URL,以及解析参数,来实现对应的URL行为操作。它可以用来处理跳转逻辑,也可以用来封装复杂的功能。
基于键值对匹配查找URL,使用深度优先(DFS)
、前序遍历(DLR)
、非递归算法,效率更高,匹配精度更好。
Github 链接
安装
- CocoaPods:
pod 'NKRouter'
- 手动安装:添加
NKRouter
文件夹到项目
基础使用
注册全局URL路径,定义行为操作
- (void)registerUrl {
[[NKRouter globalRouter] registerUrlPath:@"app/home/view" handler:^(NSDictionary * _Nullable parameters) {
// 定义需要实现的行为操作
}];
}
匹配URL路径,实现已经注册的URL行为操作
- (void)routeUrl {
[[NKRouter globalRouter] routeUrl:@"app/home/view" completionHandler:^(NKRouterResponse * _Nonnull response) {
// 当行为操作完成时回调,通知是否匹配到URL
// 高级操作中,可以查看URL行为是否成功,获取行为的返回参数
}];
}
NKRouter支持通过[NKRouter routerForScheme:@"myScheme"]
来自定义路由Scheme,实现不同模块下,对同一个URL实现不同的操作。你也可以使用下面的语法糖直接注册和匹配:
[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
}];
注意:
- 若URL的Scheme为空,则默认使用
[NKRouter globalRouter]
做注册和匹配 - 注册和匹配时,只有URL的scheme和path会被使用,host会被忽略,可以使用
myScheme:///app/home/view
来定义path
参数传递
匹配URL时,URL的query会作为入参,也可以传递自定义参数。
注意: 当query和自定义参数存在同一个key时,会使用自定义参数的value。
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];
or
[NKRouter registerUrl:@"sheme://host/app/home/view" session:mySession];
方法sessionRequest:completionHandler:
在匹配到URL时会被执行
-
request
请求信息, 包括requestUrl
,parameters
,matchPath
,matchType
等 -
completionHandler
必须在会话操作完成时回调,通知URL请求者相关请求已经完成。同时可以设置操作结果信息。包括操作是否成功:succeed
,操作返回数据:responseObject
,错误信息:error
@interface MySession : NKRouterSession
@end
@implementation MySession
- (void)sessionRequest:(NKRouterRequest *)request completionHandler:(void (^)(BOOL, NSDictionary * _Nullable, NSError * _Nullable))completionHandler {
// 获取请求参数,实现操作,
// 完成时,必现回调 completionHandler
}
@end
可选参数
NKRouter支持使用可选参数注册,可选参数能匹配到任何的目录。
注册时,:
开头的目录被认为是可选参数,会被复写为:option
,
例如,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 path的最后一级目录。通配符可以匹配多级目录,包括本级目录。
例如,下面的URL可以匹配到任何wildcard/
开头的URL,包括wildcard/
, wildcard/view
, wildcard/view/subview
等,但是不能匹配到home/view
[[NKRouter globalRouter] registerUrlPath:@"wildcard/*" handler:^(NSDictionary * _Nullable parameters) {
// matched wildcard,wildcard/view, wildcard/view/subview...
}];
匹配算法
算法介绍:
- 基于键值对(
key-value
)匹配查找,使用深度优先(DFS
)、前序遍历(DLR
)、非递归算法。 - URL请求仅会被最匹配的操作触发一次。
算法描述:
NKRouter会匹配到最符合要求的URL操作。
- 先匹配当前目录是否存在,若存在,进入下一级目录
- 若不存在,匹配可选参数,若存在,进入下一级目录
- 若2者都不存在,则返回上一级目录
- 最后执行第一个能匹配到的完整URL层级目录的操作
例如,URL请求app/home/view
,会按顺序匹配以下路径的操作:
app/home/view
app/home/:option
app/:option/view
app/:option/:option
:option/home/view
:option/home/:option
:option/:option/view
:option/:option/:option
若上面的路径均不存在(未注册),则会匹配下面的通配符操作:
app/home/view/*
app/home/:option/*
app/home/*
app/:option/*
app/*
:option/*
*
若带通配符的URL路径也无法匹配成功,则会触发Undefined Session
会话操作。
最后,如果Undefined Session
也不存在,则会直接调用completionHandler
,返回匹配失败信息。