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

在Casa发布CTMeditor后,咱们都知道router能够用targert-action的方式直接调起你须要的controller来作router。git

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

这是protocol形式解决的核心问题。惟一的不一样,在于protocol须要依赖于业务自己。在硬编码和这个依赖之间的取舍,我看来硬编码问题仍是要严重些的,因此推荐protocl结合CTMeditor的形式来作router可能更合适些。web

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

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

相关文章
相关标签/搜索