NKRouter 1.0.2

NKRouter 1.0.2

Near 维护。



NKRouter 1.0.2

  • Nate Kong

NKRouter

Platforms CocoaPods Compatible

它是什么?

NKRouter 是一个强大的基于 URL 路由的高效库,具有基于块的简单和高级可操作会话 API。它旨在使处理应用中复杂的 URL 方案变得非常容易。NKRouter 具有更高的效率和更好的匹配精度。

基于匹配而不是遍历触发操作

使用 DFSDLR 非递归 算法作为匹配算法。

中文说明

安装

  • 使用 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请求信息模型,包括requestUrlparametersmatchPathmatchType
  • completionHandler 会话应尽快调用 completionHandler,以通知 URL 路由请求者此操作是否成功,以及响应 responseObjecterror
@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/controllerapp/home/userapp/home/helper ... 的路由 URL,但不能匹配其他目录不匹配的 URL,如 web/home/controllerapp/user/controller ...,也不匹配更多或更少目录的情况,如 app/homeapp/home/controller/view...

NKRouter 还支持设置多个可选目录,例如 app/home/:controller/:view(匹配 app/home/controller/viewapp/home/user/info ...)以及可选目录可以设置在任何目录中,如 app/home/:controller/view(匹配 app/home/controller/viewapp/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/viewwildcard/view/subview ...),但不会触发类似 home/view 的 URL。

[[NKRouter globalRouter] registerUrlPath:@"wildcard/*" handler:^(NSDictionary * _Nullable parameters) {
    // matched wildcard,wildcard/view, wildcard/view/subview...
}];

匹配算法

算法概述

  • 匹配算法使用 DFSDLR 的非递归算法。
  • 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

注意:URL路由请求只触发一次。这意味着如果已经注册了app/home/view,则不会触发下方的路由app/home/view,并路由到app/home/view会话。

许可

此项目适用MIT许可证协议。更多信息请参阅LICENSE