URLRouter:将不同的模块定义成为不同的URL,通过URL的形式进行跨模块调用。
传递一串参数URL就可以进行页面间的跳转,通过分解URL的字段来获取要跳转的页面和携带的参数,指向不同的页面,也可以支持多级页面跳转。URL的通用性也适用于跨平台实现,iOS, Android,Flutter都可以按照URL来进行路由。
同时可以兼容APP间跳转URL Scheme进行进程间的通信,同App外面打开App中的某个页面。
当然这种方案缺点也是很明显的,基于URL的设计只适合与UI界面,功能性的模块是不能采用这种方案的,所以这种方案只适用于视图驱动的模块。
参考URL
根据URI进行拆分就能得到需要跳转的路径和参数
示例代码
[URLRouter openRoute:@"dnfgamehelper://MomentModule/vc/MomentDetailViewController?momentId=10018&show=1" onVC:self handler:^(NSDictionary * _Nonnull callback) {
}];
通过url可以获取要跳转的VC:MomentDetailViewController以及参数:momentId=10018&show=1
Protocol(协议)的声明看起来类似一个类的接口,不同的是Protocol没有父类也不能定义实例变量。Protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法。因为OC是单继承的,由于不支持多继承,所以很多时候都是用Protocol和Category来代替实现多继承。Protocol只能定义公用的一套接口,但不能提供具体的实现方法。
Protocol的基本用途:
原理:
利用OC的runtime能力,动态的调用指定Target的action.
核心代码
Class cls = NSClassFromString(@"TargetClassName");
id obj = [[cls alloc]init];
SEL aSelector = NSSelectorFromString(@"doSomethingWithParam1:param2:");
NSMethodSignature *sig = [cls instanceMethodSignatureForSelector:aSelector];
NSInvocation *msgInvocation = [NSInvocation invocationWithMethodSignature:sig];
[msgInvocation setTarget:obj];
[msgInvocation setSelector:aSelector];
[msgInvocation setArgument:¶1 atIndex:2];
[msgInvocation setArgument:¶2 atIndex:3];
[msgInvocation invoke];
[msgInvocation getReturnValue:&callBackValue];
原理如下
URLRoute优点
URLRoute缺点
Target-Action优点
Target-Action缺点
ProtocolClass优点
ProtocolClass缺点