分析Router中的Protocol方式和Category方式的优缺点

471 阅读1分钟

在Casa发布CTMeditor后,我们都知道router可以用targert-action的方式直接调起你需要的controller来做router。

但是这种形式存在的问题大家基本都提出了:就是硬编码问题,在编写Category的时候你不可避免的需要以硬编码的方式去写target和action以及参数转换。后来再此基础上,有人就结合蘑菇街的protocol形式来做,就是要抛出的东西,我以protocol的形式给出去,这样的话你就很清楚的知道你要调用什么,不需要中间硬编码的过程。

这是protocol形式解决的核心问题。唯一的不同,在于protocol需要依赖于业务本身。在硬编码和这个依赖之间的取舍,我看来硬编码问题还是要严重些的,所以推荐protocl结合CTMeditor的形式来做router可能更合适些。

和蘑菇街的老的url注册形式应该是不需要比较了,这个需要每个去注册url,管理url,成本太高。而且注册据说还有crash风险,虽然我没遇到过。

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];
}

以上三种方式我都在自己的github中开源。

代码地址: Protocol和Category URL形式