Router

Router

  App的架构很多,MVC、MVVM、MVP等等的出现,都是希望从高内聚、低耦合的角度出发开发与维护App。

  当代是一个以信息与数据驱动的时代,一个App可以把UI看成各种提供体验的容器,把数据看成这个容器的填充物,这时,多变的业务需求就可能出现同一个容器装不同的填充物或同样的填充物放到不同的容器中这种多对多的关系。Router在这里就起到解耦作用,做到即便需求多变,但也能灵活执行的效果。

  对于本文中的内容,已封装为一个Framework,支持CocoaPods集成。

  • 语言:Objective-C
  • 源码地址:Zouter

使用

1 初始化

  在集成了Zouter后,首先要做的就是初始化,因为Zouter采用URL的形式来定位,所以对于URL中的scheme可以由开发者自定义,若开发者没有进行自定义,那么默认获取全小写的CFBundleName作为scheme

  初始化实现如下:

[Zouter initializeWithScheme:@"DEFINE_YOUR_SCHEME_HERE"];
[Zouter sharedInstance];
2 配对URL

  Zouter支持的URL格式如下:

scheme://class:ZouterMode/method?keys=values

  URL定义规则如下:

  • scheme要与初始化时的相同
  • class为类名
  • ZouterMode是一个枚举,表示将要执行的方法是类方法(0)还是对象方法(1)
  • method为方法名
  • keys=values为提供给method的参数

  对于希望被Zouter执行的方法,为了方便标记和降低耦合,尽量使用category或extension的方式定义,且方法名必须以zr开头,在便于标记暴露给Zouter调用的方法的同时,也用于限制Zouter可调用的方法。另外,对于method的定义规则,如下:

(id)zrMethodNameWithParameters:(NSDictionary *)parameters
  • 要求返回值为id
  • 要求方法名以zr开头
  • 要求带字典参数parameters

  从Zouter.h中可见,提供了两种用于执行的方法,如下:

- (id)openURL:(NSURL * _Nonnull)url withRetainIdentifier:(NSString * _Nullable)retainIdentifier completion:( void(^ _Nullable)(id))completion;
- (id)openURL:(NSURL * _Nonnull)url withRetainIdentifier:(NSString * _Nullable)retainIdentifier;
- (id)openURL:(NSString * _Nonnull)url completion:(void(^_Nullable)(id))completion;
- (id)openURLString:(NSString * _Nonnull)urlString withRetainIdentifier:(NSString * _Nullable)retainIdentifier completion:(void(^_Nullable)(id))completion;
- (id)openURLString:(NSString * _Nonnull)urlString withRetainIdentifier:(NSString * _Nullable)retainIdentifier;
- (id)openURLString:(NSString * _Nonnull)urlString completion:(void(^_Nullable)(id))completion;

  当URL中的ZouterMode1,且method能找到类中的方法时,若retainIdentifier参数不为nil,那么Zouter单例会保留class初始化对象,当需要释放掉这个对象时,可以通过如下API,传递相同的classretainIdentifier进行释放:

- (void)releaseObjectOfClassName:(NSString * _Nonnull)className retainIdentifier:(NSString * _Nonnull)retainIdentifier;

  在使用过程中,发现Zouter限制依旧有点大,还不算太灵活,后续版本将逐渐优化,有想法的也欢迎提PR或Issue。

参考文章

lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6