美文网首页
蘑菇街的组件化之路

蘑菇街的组件化之路

作者: George2016 | 来源:发表于2018-03-01 10:45 被阅读411次

    原文

    问题一:何为利用URL的方式打开ViewController?

    简单举个例子。
    首先,看一下一个Node.js服务端如何处理一个get请求。
    http://weibo.com/u/1438670852/home?topnav=1&wvr=6 这是个登录之后的微博的首页URL。其实服务端拿到这个url之后可以利用一些中间件,例如bodyparser之类的把url解析了。比如。你可以这样获得topnav的值和wvr的值。

    app.get('http://weibo.com/u/:userid/home', function(req, res) {
        var topnav = req.body["topnav"];
        var wvr = req.body["wvr"];
    });
    

    那么,其实蘑菇街的组件化方案的其中一个功能就是仿照服务端解析URL的方式来处理ViewController之间的跳转。
    蘑菇街是怎么做的?

    1. 注册Class。在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中先使用单例MGJRouter注册所有的ViewController的Pattern,也即VC的模板,你可以想象成是一个字符串对应一个Block,这个block里面包含了生成ViewController的代码和需要的赋值的参数。比如上述的DetailViewController可以描述成这样。
    [MGJRouter registerURLPattern:@"mgj://detail?name=:name&summary=:summary" toHandler:^(NSDictionary *routerParameters) {
        NSString *name = routerParameters[@"name"];
        NSString *summary = routerParameters[@"summary"];
        // create view controller with id
        // push view controller
    }];
    
    

    这样注册了之后,这个MGJRouter单例里就储存了这个ViewController.单例里无非就是有一个可变字典的property,
    比如有一个NSMutableDictionary *routers,然后呢。
    [[routers setObject:block forKey:url];] 这样就注册了。
    那么,怎么用?
    既然有了存的方法,那自然有取得方法。
    比如。[MGJRouter openURL:@"mgj://detail?name=:name&summary=:summary" withParam:@{@"name": @"zql", @"summary":@"wuyanzu" }]; 这样,只需要在字典里通过URL取得block,然后将参数填进去就行了。 如果还是不理解看这个开源库。
    routable-ios

    问题二:什么是上下文?

    几篇文中都大量的出现了上下文这个关键字。上下文到底是什么? 上下文对应的英文单词是Context。对此比较好理解解释的是轮子哥的下面这段话。

    每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行。你为了使他们运行,就要给所有的外部变量一个一个写一些值进去。这些值的集合就叫上下文。
    看代码。

    DetailViewController *detailVC = [DetailViewController alloc] init];
    detailVC.name = @"xxx";
    detailVC.summary = @"xxx";
    [XX.navigationController detailVC];
    

    这就叫没有剥离上下文。
    why?
    因为你为了使这个页面跳转,你必须要给DetailVC传一些值。传的这些值就构成了上下文。
    大家注意这段话。

    然而这款方案有一个很小的缺陷在于对param的key的hardcode,这是为了达到最大限度的解耦和灵活度而做的权衡。在我的网络层架构和持久层架构中,都没有hardcode的场景,这也从另一个侧面说明了组件化架构的特殊性。

    我为什么要把反革命工程师里总结的这句话贴出来,因为这句话很重要。后面会提到。

    问题三:什么叫去Model化?

    举个例子。有个ModelA

    ModelA *model = [[ModelA alloc] init];
    ViewControllerA *a = [[ViewControllerA alloc] init];  
    a.model = model;
    [self.navigationController pushViewController:a animated:YES];
    

    所以从当前页面跳转到a这个控制器的时候需要传入一个ModelA的实例。那么如果ModelA因为业务逻辑的变更,有一个属性没了,或者改名字了,或者加了什么property。
    那么,你就需要在所有的工程文件里凡是引用了这个Model的文件里都check一遍。防止发生问题。这就没有解耦。
    为了防止这种情况,我们在这种情况下,就需要去Model化(那Model还有什么用?)。 比如你的ViewControllerA需要传入5个值。那你就老老实实的别传Model。一个个传值。

    相关文章

      网友评论

          本文标题:蘑菇街的组件化之路

          本文链接:https://www.haomeiwen.com/subject/qbqgxftx.html