原本一直在用Objective-C開發(fā)爹土,應用本身是基于MVC來構建代碼結構的,最近了解到SwiftUI必須遵守MVVM才能工作焦人,所以開始深入了解這個概念竖独。主要是通過斯坦福大學這個公開課學習,總結一下重要的知識點砂客。鏈接:
https://www.bilibili.com/video/BV14z4y1d7b4?spm_id_from=333.999.0.0
MVC
MVC是Model-View-Controller結構泥张,在傳統(tǒng)UIKit框架中使用。并不是說UIKit一定要用MVC鞠值,而是和MVC的匹配度較高媚创。
- MVC的Model一般相對簡單,只是創(chuàng)建一個數(shù)據(jù)對象格式彤恶。而數(shù)據(jù)的封裝钞钙、操作和管理,一般都是放在Controller中執(zhí)行声离。
- MVC的View進行視圖的構建芒炼、渲染和事件響應處理,以及提供一些刷新方法供Controller使用术徊。
- Controller則承擔數(shù)據(jù)本刽、邏輯和視圖更新操作,與View和Model的關系是單向通信的赠涮,而Controller向View進行命令式(imperative)的指令操作子寓。
舉例:
帝國中的皇帝發(fā)出各種命令指揮別人做事情,一個國家就是這么運轉起來的笋除。但是缺點很明顯别瞭,由于命令是一個個下發(fā)的,這其中非常不利的一個原因就是時間株憾。
在UI開發(fā)中蝙寨,這種命令式執(zhí)行晒衩,函數(shù)隨著時間推移進行調用:這個Button放這里,那個Label放那里墙歪,過一會做這個听系,再一會執(zhí)行那個,又可能其他人隨時可以調用函數(shù)來更改UI虹菲,就要時刻保持警惕靠胜。
這時,我們就需要一個時間線去理解調用函數(shù)的順序毕源,并且我們無法證明界面在任意順序調用任意函數(shù)情況下浪漠,界面能夠真實有效的工作。因為在命令式操作下霎褐,無法同時執(zhí)行所有指令址愿。
MVVM
MVVM是Model-View-ViewModel結構,在SwiftUI框架中使用冻璃。SwiftUI是響應式編程(reactive programming)响谓。
- MVVM的Model與UI完全獨立,處理數(shù)據(jù)和邏輯的操作省艳。數(shù)據(jù)流(data flows)在映射到視圖的過程中是只讀的娘纷。
- MVVM的View是聲明式(declarative)視圖,我們?yōu)閁I聲明的方法跋炕,在任何時候做它們應做的事情赖晶。不需要關心任何狀態(tài)變化(state changes),狀態(tài)在Model中記錄辐烂,View僅僅是映射Model中的數(shù)據(jù)遏插,Model變化帶來View變化,所見即所得棉圈。
Stuct結構體中的代碼,實際上是只讀的眷蜓,調用時不可能有其他人改變函數(shù)中的代碼分瘾,看到的就是聲明的。
- ViewModel執(zhí)行解釋(interpreter)工作吁系,將View綁定到Model上德召。ViewModel關注Model中的變化(notices changes),然后發(fā)布這些變化(publishes changed)汽纤,訂閱(subscribes)了某個發(fā)布(publication)的View會進行改變上岗。
重要的一點是理解ViewModel沒有直接指向View的指針,不直接與View對話蕴坪。如果View訂閱了某個發(fā)布肴掷,就會詢問ViewModel怎么適應現(xiàn)在的變化敬锐,這個過程不會回到Model,因為ViewModel作用就是解釋Model的變化呆瞻。
MVVM的Processes Intent
MVVM有一個對應的關聯(lián)架構台夺,是Model-View-Intent。如果用戶意圖(intent)做一些操作痴脾,那么這些Intent就要進行View到Model這個反向傳遞過程颤介。而swiftUI還沒有進行這個設計,所以我們用下面一系列操作來處理Intent:
- View Calls Intent function 視圖調用方法
- ViewModel modifies the Model 視圖模型修改模型
- Model changes 模型改動變化
- ViewModel notices changes and publishes 模型關注到變化并發(fā)布
- View whitch subscribes Reflect the Model 訂閱變化的視圖進行模型映射
對比MVVM的映射過程赞赖,多了ViewModel處理View操作滚朵,并且修改Model這兩個操作。
總結
OC作為使用數(shù)十年的iOS第一開發(fā)語言前域,確實在現(xiàn)今各種新興前端語言中辕近,顯得繁冗不堪。Swift在數(shù)年的時間內逐漸迭代话侄,替代OC已經(jīng)是不可阻擋的歷史浪潮亏推。
哪怕OC這么強大的語言,不進步也很快就要被淘汰了年堆,何況我們只是時代的搬磚人呢吞杭,不斷學習新內容是我們必須做的事情。