ZZRouter

作者: 慵懒的大神 | 来源:发表于2020-07-20 20:05 被阅读0次

ZZRouter (OC)

一款只专注于路由的简单框架

自己造的轮子,非本人许可,禁止转发!

github

https://github.com/LzzHero/ZZRouter

使用

ZZRouter分为路由的注册和使用两个阶段

注册一个路由

1、引入 <ZZRouter/ZZRouter.h>

2、在VC的 load 方法中 写入代码:

+ (void)load {
    RouterPath(@"name")
}

其中 name 为该模块(VC)的唯一标识

使用路由进行跳转

1、引入 <ZZRouter/ZZRouter.h>

2、调用以下代码即可完成跳转

ZZRouter.load(@"name");

默认跳转方式为push

3、当然,如果在跳转中传递参数,只需如下操作即可

ZZRouter.load(@"name",@{@"id":@"123"});

至此,恭喜你已经完成了对ZZRouter的接入

进一步操作

ZZRouter还提供了许多方法,可以自定义跳转事件和自定义转发的拦截,辅助完成各种业务场景

转发单元

ZZRouter实现页面的跳转,是依赖于转发单元。
每一个模块“name”,都对应一个转发单元“unit”(ZZTransUnit)
使用者可以自定义转发单元来实现跳转操作,如果没有自定义的实现,ZZRouter将会自动帮助你实现一个,并且默认为push操作

自定义转发单元

你可以通过自定义转发单元来达到present,或者自定义VC切换动画的目的。

1、自定义的转发单元,需要继承自 ZZTransUnit

@interface myUnit : ZZTransUnit
@end

2、在 myUnit 的load方法中,注册转发单元
注意,这里的name必须和模块的name保持一致,这样才能准确地匹配模块

+ (void)load {
    RouterUnit(@"name")
}

3、实现消息转发的方法

其中参数:
toObject -- 即将跳转的VC,或者可以理解为注册了 RouterPath(@"name") 的对象
param -- 在外部调用时外边传递的参数
complete -- 一个block,在自定义的事件处理完以后,需要调用该block(BOOL),他需要一个bool值,告诉是否成功完成自定义的跳转。此处在稍后的路径跳转会说明调用的原因。

你也可以直接调用super的方法,super的方法就是默认push到toObject

- (void)dealMessageWithtargetObject:(id)toObject params:(id)param dealFinished:(void (^)(BOOL))complete {
    //[super dealMessageWithtargetObject:toObject params:param dealFinished:complete];
}

至此,你已经自定义了转发单元,并可以在这里进行自定义的跳转操作。

拦截器

拦截器,顾名思义,针对一个或一种活一类路由进行过滤,只通过想要通过的路由。
当消息发送给转发单元前,会先被拦截器拦截

自定义拦截器

ZZRouter本身不自带任何拦截器,如果需要拦截,要自定义拦截器使用。

1、拦截器,要继承自 ZZTransFilter

@interface MyFilter : ZZTransFilter
@end

2、在 MyFilter 的load方法中,注册拦截器

这里的name,你可以直接传入与 RouterPath(@"name") 同样的那name,这样这个拦截器只对这个路由起作用

你也可以传入一个正则表达式,来匹配与之相符的所有跳转
比如:RouterFilter(@"name1|name2")
如果你想匹配所有的路由,可以用:RouterFilter(@"*")但是,为*的过滤器只能有一个,多个会以最后加载的为主

+ (void)load {
    RouterFilter(@"name")
}

3、实现拦截的方法

其中参数:
url -- 路由的name,即调用的路由地址
toObject -- 即将跳转的VC,或者可以理解为注册了 RouterPath(@"name") 的对象
param -- 在外部调用时外边传递的参数

返回参数:
需要一个BOOL值,若为true,则通过校验。若为false,则不通过,消息不会转发给后面的转发单元

- (BOOL)willTransRouter:(NSString *)url toViewObj:(id)toObject params:(id)param {
    return YES;
}

说明:
一个路由,如果有多个拦截器拦截,则对所有拦截器的返回结果做与操作,都满足才会继续转发。

至此,你已经可以使用拦截器去拦截路由了

路径跳转

路径跳转是ZZRouter特有的功能,它可以支持如下调用:

ZZRouter.load(@"name1/name2/name3");

这样,可以首先跳转到name1界面,然后跳转到name2界面,最后在跳转到name3界面。
如果其中有自定义的unit的filter的话,就是如下解释:

1、执行name1所有的filter,若通过,执行name1对应的unit
2、执行name2所有的filter,若通过,执行name2对应的unit
3、执行name3所有的filter,若通过,执行name3对应的unit

想要实现路径调用,很重要的一点就是在自定义unit的时候,在自定义跳转结束以后,需要调用complete这个block,并且传入一个BOOL类型的跳转结果。若为YES,则会继续传递下一个路由进行跳转,若为NO,则停止传递。

问题说明

关于路径跳转,有以下几种问题,在此意义说明:

1、对于自定义unit,若不调用complete,则在执行到该路径后,就无法继续执行下去了。所以推荐执行。

2、对于传参,在一开始进行的参数
比如:ZZRouter.load(@"name1/name2/name3",@{@"name":@"123"});
其中的参数会传递到所有的filter和unit

3、对于filter,只会拦截路径上的某一个路由的执行,不会阻断整条路径的执行。
比如路由为:ZZRouter.load(@"name1/name2/name3");
这个时候,对于name2的filter返回的是false,name1和name3返回的都是true,则上面的调用等价于“
ZZRouter.load(@"name1/name3");

想要阻断路径跳转的话,请在unit中,complete传入false

重置(replace)

重制是ZZRouter自带的一个已经实现的转发单元,他的路由是 zz_replace
通过调用 ZZRouter.load(@"zz_replace");
可以直接回到根视图控制器。(可以越过多级push和present)

以下调用:
ZZRouter.load(@"zz_replace/name1");
便是:首先回到根目录,然后在进入name1

一些范例的实现

如果你看到这里,那么恭喜你,你已经知道了ZZRouter的全部功能。
本人针对项目中实际应用的场景,给出几种场景下应用ZZRouter的思路,供大家参考

公共参数

项目里经常会遇到的就是公共参数,对于每一个VC,都需要把一些通用的参数在传递的时候进行赋值。
这样的话,在ZZRouter里面,就是一个Filter

1、自定义公共参数的filter

@interface ParamsFilter : ZZTransFilter
@end

2、注册filter

+ (void)load {
    RouterFilter(@"*")
}

3、实现拦截器

- (BOOL)willTransRouter:(NSString *)url toViewObj:(id)toObject params:(id)param {
    [toObject addParams:……];
    return YES;
}

登陆拦截

对于登陆操作,按理说应该由调用方自己做登陆判断,确认用户成功登录以后,在调用load方法进行跳转。
不过使用ZZRouter也可以实现登录验证。

1、注册一个unit,我们命名为登陆的unit

LoginUnit.h

@interface LoginUnit : ZZTransUnit
@end

LoginUnit.m

+ (void)load {
    RouterUnit(@"login")
    RouterPath(@"login")
}

2、执行登陆逻辑

- (void)dealMessageWithtargetObject:(id)toObject params:(id)param dealFinished:(void (^)(BOOL))complete {

    [YourLoginService login:^(BOOL success){
        complete(success);
    }];
}

3、调用:

ZZRouter.load(@"login/name1");

如此,在登陆成功后,就会执行complete,根据登陆成功与否,决定是否会进入name1

写在后面

ZZRouter还有很多功能等待挖掘。
如果想要联系我,可以给我发简信,或者在下边留言,我会一一回复。

相关文章

  • ZZRouter

    app的router进化史 我们在做iOS开发的时候,通常会在远程推送,h5与native互相跳转的时候使用...

  • ZZRouter

    ZZRouter (OC) 一款只专注于路由的简单框架 github https://github.com/Lzz...

网友评论

    本文标题:ZZRouter

    本文链接:https://www.haomeiwen.com/subject/sfzykktx.html