該文章適合有一定iOS開發基礎的伙伴,如果你是一位iOS新手,那麼該文章現在不適合你,可以先收藏,以後再消化。
ReactiveCocoa(其簡稱為RAC)是由Github開源的一個應用於iOS和OS X開發的新框架。RAC具有函數式編程和響應式編程的特性。它主要吸取了.Net的 Reactive Extensions的設計和實現。
ReactiveCocoa結合了幾種編程風格:
函數式編程(Functional Programming):使用高階函數,例如函數用其他函數作為參數。
響應式編程(Reactive Programming):關注於數據流和變化傳播。
所以,你可能聽說過ReactiveCocoa被描述為函數響應式編程(FRP)框架。編程范式是個很范的概念,不作為本篇的主題。
任何一個軟件工程師知道MVC,它意思是Model-View-Controller, 是項目開發中公認的代碼組織模式。 在 iOS 開發中它還有著第二種含義: Massive-View-Controller(重量級視圖控制器),它沒有指出網絡代碼、數據組織代碼所在的層次,導致Controller負責太多的事情,代碼變得臃腫復雜。每當碰到這類代碼需要需改的時候,程序員腦中都會想過重構、解耦代碼的想法,然而因為時間、風險等等原因,大家只能想想了。總的來說, 很多iOS 開發者已經意識到: 需要給視圖控制器(UiViewController)瘦身, 並進一步分離業務。
傳統MVC模式工程主要會出現2個問題:
iOS開發過程中,狀態依賴(KVO)實現方式復雜,實用性較小
UiViewController比較復雜,代碼耦合性較高
很多開發者都會遇到上面的問題,這時我們需要思考如何解決這類問題,尋找新的方案?
MVVM
於是MVVM流行起來, 它代表Model-View-ViewModel, 它主要解決Controller層復雜性高、耦合性高的問題,幫助我們重新組織工程代碼。我將要在這裡展示的 MVVM 的風格, 它跟 MVC 十分兼容,只要我們將 MVC中Controller層的代碼分開處理即可完成。
我不會抬高MVVM、貶低MVC, 因為他們各有優缺,不會相互取代,同時還可相互兼容。 MVVM模式也是我第一次使用,我將會關注如何用它進行 iOS開發。
MVVM的定義
Model 在 MVVM 中沒有真正的變化。 取決於你的偏好, 你的 model 可能會或可能不會封裝一些額外的業務邏輯工作。我更傾向於把它當做一個容納表現數據-模型對象信息的結構體, 並在一個單獨的管理類中維護的創建/管理模型的統一邏輯。
View包含實際 UI 本身(可以是 UIView 代碼, xib,storyboard), 可以包含視圖特定的邏輯, 或用戶操作的反饋。在 iOS 中這不僅需要 UIView 代碼和那些文件, 還包括部分UIViewController。
View-Model 這個術語本身比較疑惑, 因為它混搭了前面兩個我們已知的術語, 但卻是完全不同的東西。 它不是傳統模型層和視圖層的結合,它的職責之一就是作為一個中間層連接模型層(Model);它還承擔收集、解析和轉換數據的責任。這將這留給了 view (controller) 一個更加清晰明確的任務:承載View層視圖,組織展示由 view-model 提供的數據。
MVC
MVVM
對比兩種模式,可以簡單的認為MVVM比MVC多了一個中間層View-Model ,可以理解為: 我們將Controller中的網絡請求代碼、數據管理代碼和部分業務代碼移動到了它擁有的View-Model 中。這樣UIViewController 就能夠專注的負責View的管理、界面流程跳轉。
盡管我們的代碼並有沒有減少,代碼層次增加了,但是Controller由臃腫變得簡潔,由復雜變得清晰。針對功能單一的層次代碼,我們易於理解,也方便進行單元測試。總的來說,MVVM模式更加適合iOS移動APP工程開發。
在下章,我將說明:
MVVM和ReactiveCocoa的關系
為什麼要使用ReactiveCocoa
ReactiveCocoa的基本用法