MVVM-C简介

今年以来,项目一直使用MVVM架构,但是一直有两个困扰,1:不同模块之间的跳转由谁来完成(比如点击tableview的cell的时候,从list跳转到detail).2:MVVM各个模块如何组合(谁包含或者拥有谁)及如何初始化.

我一直是有viewconroller(也就是MVVM的View模块)完成任务1,所以相对于问题2来说,我的模块组织关系为,view拥有viewmodel,viewmodel有用model .

这样做的一个明显问题是,viewcontroller承担的任务依然很多.除了ui(view)相关的一些代码外. 他还需要处理页面跳转的逻辑.

代码经常是这样的:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
    }
    
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        
    }
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        
    }
    
    
    //delegate for viewmodel
    
    func viewModeDelegateGotoAnotherView(viewId:String)
    {
        //初始化新的model
        //初始化新的viewmodel,初始化新的view,
        //跳转逻辑,也许还有自定义跳转动画....
    }
    //...other delegate function 

一直想改善一下这个情况,我尝试使用单例Router去解决这个问题Router.shareInstance.goToAnotherView(viewId:String),这样可以简化viewcontroller,但是显然程序的结构很古怪.

知道最近看到两个关于MVVM的精彩视频:

1:@macdevnet“MVVM-C In Practice”,相关实例代码地址    .

这个视频的讲演者很幽默,描述的也非常清晰,强烈推荐.捎带还分析了KVO,delegate,Notification,Reactive programming,的优劣以及他自己的偏好,这里的说法我非常赞同.他倾向是用delegate:

“boring and trustrating to write? yes!

is this code incredibly easy to read and understand?yes!

is it this one of the simplest solutions and therefore probably a good one? yes!”

2:@Krzysztof Zabłocki“Good iOS Application Architecture”. 作者的博客地址.

他们都是通过一个Flow Controller来优雅的解决这个问题.   与此同时,看到Rodrigo Reis也写了一篇关于这两个视频的文章“MVVM with Flow Controller — First Step”,并介绍了自己的想法和实例代码, 他给出的图示很清晰的描述了这种组织结构中,模块之间跳转的关系:

1