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中的ZouterMode
为1
,且method
能找到类中的方法时,若retainIdentifier
参数不为nil
,那么Zouter
单例会保留class
初始化对象,当需要释放掉这个对象时,可以通过如下API,传递相同的class
和retainIdentifier
进行释放:
- (void)releaseObjectOfClassName:(NSString * _Nonnull)className retainIdentifier:(NSString * _Nonnull)retainIdentifier;
在使用过程中,发现Zouter
限制依旧有点大,还不算太灵活,后续版本将逐渐优化,有想法的也欢迎提PR或Issue。