MVVM in Practice - RWDevCon Session - raywenderlich.com
MVVM已经被谈论很多了,却一直没有深入理解和实践,本篇是在观看该视频后的小结。
该视频中讲解了MVC到MVVM的迁移重构和重点,并没有涉及到FRP,初学者可以很快进入MVVM中。
概念
MVVM: Model-View-ViewModel。通过分离ViewController中逻辑代码到独立的ViewModel中,实现业务逻辑分离和VC瘦身。
重点:Data Binding
iOS中的数据绑定方式:
- KVO
- Delegate
- Funtional Reactive Programming
- Property Observer
1
2
3
4
5
6
7var 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
27class 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实现绑定。
提问环节
(只给出回答中的重点内容)
- 为什么ViewModel使用的是class而不是struct?
Ash:说是因为他认为这个ViewModel中不仅是数据逻辑,还包含有其他功能逻辑代码。 - 为什么dispatchAfter中使用weak self,而viewController中使用unowned self?
Ash:通常来说,weak修饰的变量有可能是为nil的,而unowned修饰的变量你会保证它不是optional的。
MVVM的Benifits和Limitation
Benifits:
- Breaks up code by responsibility
- Simplifies Testing
- Code reusablibity
Limitation:
- Requires binding(or other workarounds)
- Potential for boilerplate code
- Sometimes feels like overkill
- Doesn’t cover every case