YFRouter 是一个高效、轻量级的路由系统

YFRouter 是一个高效、轻量级的路由系统,帮你处理 iOS 中一系列的 URL Router 问题

Swift 开发框架

详细介绍

YFRouter

License   Support   CI Status   Pod

iOS 组件化的时代到临

YFRouter 是一个高效、轻量级的路由系统,帮你处理一系列的 URL Router 问题。

强烈建议配合 YFMediator 使用!!

News

Usage

  • Demo

2016121734431Route.gif

URL Router

[YFRouter registerURL:@"YF:///feed/detail" handler:^(NSDictionary *params) {
    YFDebug(@"%@", params);
}];

[YFRouter route:@"YF:///feed/detail?id=001" params:nil];

-------------------
{
    YFSchemeKey = YF;
    YFPathKey = @"feed/detail";
    YFURLKey = "YF:///feed/detail?id=001";
    id = 001;
}
-------------------

params 自带 三个 Key

extern NSString * const YFRouterSchemeKey;
extern NSString * const YFRouterPathKey;
extern NSString * const YFRouterURLKey;

模糊匹配

[YFRouter registerURL:@"YF:///feed/detail/:id" handler:^(NSDictionary *params) {
    YFDebug(@"%@", params);
}];

[YFRouter route:@"YF:///feed/detail/001" params:nil];

-------------------
{
    YFSchemeKey = YF;
    YFPathKey = @"feed/detail";
    YFURLKey = "YF:///feed/detail?id=001";
    id = 001;
}
-------------------

自定义参数

[YFRouter registerURL:@"YF:///feed/detail" handler:^(NSDictionary *params) {
    YFDebug(@"%@", params);
}];

[YFRouter route:@"YF:///feed/detail?id=001" params:@{@"city" : @"shanghai"}];

-------------------
{
    YFSchemeKey = YF;
    YFPathKey = @"feed/detail";
    YFURLKey = "YF:///feed/detail?id=001";
    id = 001;
    city = shanghai;
}
-------------------

Object Router

通过 URL 获取对象,有两种方式,一种是通过绑定一个 Object Handler 来获取 Object,另一种是直接将 URLObject 绑定。

+ objectForRoute:params: 获取的是 YFObject,通过 value 属性获取绑定的 Object,通过 params 获取传递的参数。

2016121717816object.gif

绑定 Object Handler
[YFRouter registerURL:@"YF:///alert" objectHandler:^id(NSDictionary *params) {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:params[@"title"] message:params[@"message"] preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
    return alert;
}];
绑定 Object
UIAlertController *alert = [UIAlertController alertControllerWithTitle:params[@"title"] message:params[@"message"] preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];

[YFRouter registerURL:@"YF://alert" object:alert];
获取 Object
// 这种写法也是可以的
// [YFRouter objectForRoute:@"YF://alert" params:@{@"title" : @"Hello", @"message" : @"World"}];
UIAlertController *alert = [YFRouter objectForRoute:@"YF://alert?title=Hello&message=World" params:nil].value;
[self presentViewController:alert animated:YES completion:nil];

YFRoutr 机制

URL 匹配机制

Scheme

YFRouter 有一个默认的 Scheme YFRouterDefaultScheme,住注册 URL 的时候如果 URL 不含有 Scheme,则会使用 YFRouter 默认的 Scheme。

extern NSString * const YFRouterDefaultScheme;

[YFRouter registerURL:@"my:///feed/detail" handler:handler]; // my:///feed/detail 

[YFRouter registerURL:@"/feed/detail" handler:handler]; // YFRouterScheme:///feed/detail 
URLPattern

标准的 Scheme 定义是 scheme://,URI 是 /path,完整的 URL 是 scheme:///path

在 YFRouter 中 URLPattern 是否以 / 开始都是可以的,即:

// 在 YFRouter 中他们是代表同一个 URL
scheme://feed/detail
scheme://feed/deatil/
scheme:///feed/detail

shouldFallbackToLastHandler

YFRouter 中有一个选项 shouldFallbackToLastHandler,默认是 NO

+ (void)shouldFallbackToLastHandler:(BOOL)shouldFallback;

我们在 YFRouter 中注册中里这个 URL

YF:///feed

我们现在让 shouldFallbackToLastHandler 设置为 NO,然后 Route 到这个 URL

YF:///feed/detail

会发现找不到对应的 Handler,因为关闭 shouldFallbackToLastHandler 之后,就是开启了严格匹配模式,只会找对应 URL YF:///feed/detail 的 Handler。

UncaughtHandler

使用这个方法注册一个 UcaughtHandler,所有未匹配到的 URL 都会进入这个方法。

+ (void)registerUncaughtHandler:(YFRouterHandlerBlock)handler;

Installation

pod "YFRouter"

Tips

建议在项目中利用默认 SchemeTarget Action 的方式来处理本地 URL

[YFRouter registerURL:@"/:target/:action" handler:^(NSDictionary *params) {
    id target = params[@"target"];
    id action = params[@"action"];
    
    // 根据 target 和 action 来处理业务
    // ...
}];

[YFRouter route:@"/user/login" params:...];
[YFRouter route:@"/user/search?text=laizw" params:...];

Author

laizw, i@laizw.cn

License

YFRouter is available under the MIT license. See the LICENSE file for more info.

推荐源码