項目開發中,常常遇到一個界面很複雜,各類控件各類View,相互之間有複雜的互動邏輯,各組件的數據有時還須要專門的服務器接口支持。服務器
MVC模式會把這些邏輯都放到C裏面實現,使得某個ViewController很是龐大複雜。無論是改動功能仍是debug,都很費時。網絡
將M-V-VM模式引入MVC中,能夠改善這種狀況。結構以下:數據結構
解釋:異步
將一個界面中的各類元素分紅幾個相對獨立的組件,每一個組件建立一個對應的ViewModel。ViewController建立並管理這些ViewModel之間的相互通信互動。spa
ViewModel管理View的刷新和用戶操做事件。若是用戶的響應須要其餘組件進行互動,則經過delegate向上傳遞給ViewController。由ViewController進行ViewModel之間的通信路由。debug
View提供一個用戶刷新顯示的API,內部元素的具體刷新實現外部不可見。接口
除了刷新顯示,View還提供用戶操做的響應,經過delegate通知ViewModel處理。事件
DataModel由ViewModel管理。它具備獲取View的數據、保存數據到某個數據結構的功能。通常會建立一個公共屬性保存獲取到的新數據。ViewModel對這個屬性創建KVO監控。路由
咱們通常會使用異步方式從網絡下載新數據,當新數據下載成功,通過解析後存儲到公共屬性裏。這時,KVO方法被激活執行,ViewModel讀取屬性的值傳遞給View,讓它刷新顯示。開發
DataModel提供一個相似reloadData的更新數據方法,由ViewModel調用。ViewModel只要調用了這個方法,一切就開始自動運行。
DataModel僅對ViewModel可見。這樣,這三者造成了一個相對獨立的生態圈,外部僅能看見ViewModel。由ViewModel提供對外的API,好比刷新數據,提交跨ViewModel通信申請等。
Demo項目在這裏下載地址