MVVM in Practice

MVVM in Practice - RWDevCon Session - raywenderlich.com

MVVM已经被谈论很多了,却一直没有深入理解和实践,本篇是在观看该视频后的小结。

该视频中讲解了MVC到MVVM的迁移重构和重点,并没有涉及到FRP,初学者可以很快进入MVVM中。

概念


MVVM: Model-View-ViewModel。通过分离ViewController中逻辑代码到独立的ViewModel中,实现业务逻辑分离和VC瘦身。

重点:Data Binding


iOS中的数据绑定方式:

  1. KVO
  2. Delegate
  3. Funtional Reactive Programming
  4. Property Observer
    1
    2
    3
    4
    5
    6
    7
        var str = "Hello, playground" {
    didSet {
    print("new str : \(str)")
    }
    }

    str = "hello swift"

实现一个Data Binding类:Box

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Box<T> {
typealias Listener = (T) -> Void
var listener : Listener?

var value:T {
didSet {
listener?(value)
}
}

init(_ value:T) {
self.value = value

}
func bind(listener:Listener?) {
self.listener = listener
listener?(value)
}
}

var bindedObj = Box("")

bindedObj.bind {
print("new value:\($0)")
}

bindedObj.value = "2017"

可以看出是使用了closure来实现bingding的。同理,Cocoa中的其他类都可以写一个extension实现绑定。

提问环节


(只给出回答中的重点内容)

  1. 为什么ViewModel使用的是class而不是struct?
    Ash:说是因为他认为这个ViewModel中不仅是数据逻辑,还包含有其他功能逻辑代码。
  2. 为什么dispatchAfter中使用weak self,而viewController中使用unowned self?
    Ash:通常来说,weak修饰的变量有可能是为nil的,而unowned修饰的变量你会保证它不是optional的。

MVVM的Benifits和Limitation

  1. Benifits:

    • Breaks up code by responsibility
    • Simplifies Testing
    • Code reusablibity
  2. Limitation:

    • Requires binding(or other workarounds)
    • Potential for boilerplate code
    • Sometimes feels like overkill
    • Doesn’t cover every case

延伸阅读

  1. ReactiveCocoa/RxSwift
  2. Getting Started With RxSwift and RxCocoa