在Casa发布CTMeditor后,我们都知道router可以用targert-action的方式直接调起你需要的controller来做router。
但是这种形式存在的问题大家基本都提出了:就是硬编码问题,在编写Category的时候你不可避免的需要以硬编码的方式去写target和action以及参数转换。后来再此基础上,有人就结合蘑菇街的Protocol形式来做,就是要抛出的东西,我以Protocol的形式给出去,这样的话你就很清楚的知道你要调用什么,不需要中间硬编码的过程。
这是Protocol形式解决的核心问题。唯一的不同,在于Protocol需要依赖于业务本身。在硬编码和这个依赖之间的取舍,我看来硬编码问题还是要严重些的,所以推荐protocl结合CTMeditor的形式来做router可能更合适些。
和蘑菇街的老的url注册形式应该是不需要比较了,这个需要每个去注册url,管理url,成本太高。而且注册据说还有crash风险,虽然我没遇到过。
以上三种方式我都在自己的github中开源。
Category:
#pragma mark - category的形式
- (void)webBlock {
UIViewController *controller = [[KZWRouter sharedRouter] kzw_KZWWebViewController:@"https%3a%2f%2fwww.zhihu.com%2f" callBackHandle:^(NSString *result) {
NSLog(@"result:%@", result);
}];
[self presentViewController:[[UINavigationController alloc] initWithRootViewController:controller] animated:YES completion:nil];
}
Protocol:
#pragma mark - protocol的形式
- (void)webAction {
id<KZWWebView> KZWWebViewService = [[KZWRouter sharedRouter] findProtocolService:@protocol(KZWWebView)];
UIViewController *controller = [KZWWebViewService kzw_KZWWebViewController:@"https%3a%2f%2fwww.zhihu.com%2f" callBackHandle:^(NSString *result) {
NSLog(@"result:%@", result);
}];
[self presentViewController:[[UINavigationController alloc] initWithRootViewController:controller] animated:YES completion:nil];
}
代码地址:
Protocol和Category
URL形式