NKRouter - URL模块路由

简介

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,返回匹配失败信息。

注意:URL请求只会由最匹配的操作触发一次,就是说,如果app/home/view不存在,才会匹配app/home/:option,如果app/home/:option存在,就会立即执行,app/home/:option以后的所有URL都不会再做匹配,也不会执行。

你可能感兴趣的:(NKRouter - URL模块路由)