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

在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形式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容