SwiftUI學(xué)習(xí)-1 MVVM的理解

MVVM

原本一直在用Objective-C開發(fā),應(yīng)用本身是基于MVC來(lái)構(gòu)建代碼結(jié)構(gòu)的,最近了解到SwiftUI必須遵守MVVM才能工作,所以開始深入了解這個(gè)概念。主要是通過(guò)斯坦福大學(xué)這個(gè)公開課學(xué)習(xí),總結(jié)一下重要的知識(shí)點(diǎn)。鏈接:

https://www.bilibili.com/video/BV14z4y1d7b4?spm_id_from=333.999.0.0

MVC


MVC是Model-View-Controller結(jié)構(gòu),在傳統(tǒng)UIKit框架中使用。并不是說(shuō)UIKit一定要用MVC,而是和MVC的匹配度較高。

  • MVC的Model一般相對(duì)簡(jiǎn)單,只是創(chuàng)建一個(gè)數(shù)據(jù)對(duì)象格式。而數(shù)據(jù)的封裝、操作和管理,一般都是放在Controller中執(zhí)行。
  • MVC的View進(jìn)行視圖的構(gòu)建、渲染和事件響應(yīng)處理,以及提供一些刷新方法供Controller使用。
  • Controller則承擔(dān)數(shù)據(jù)、邏輯和視圖更新操作,與View和Model的關(guān)系是單向通信的,而Controller向View進(jìn)行命令式(imperative)的指令操作。

舉例:
帝國(guó)中的皇帝發(fā)出各種命令指揮別人做事情,一個(gè)國(guó)家就是這么運(yùn)轉(zhuǎn)起來(lái)的。但是缺點(diǎn)很明顯,由于命令是一個(gè)個(gè)下發(fā)的,這其中非常不利的一個(gè)原因就是時(shí)間。
在UI開發(fā)中,這種命令式執(zhí)行,函數(shù)隨著時(shí)間推移進(jìn)行調(diào)用:這個(gè)Button放這里,那個(gè)Label放那里,過(guò)一會(huì)做這個(gè),再一會(huì)執(zhí)行那個(gè),又可能其他人隨時(shí)可以調(diào)用函數(shù)來(lái)更改UI,就要時(shí)刻保持警惕。
這時(shí),我們就需要一個(gè)時(shí)間線去理解調(diào)用函數(shù)的順序,并且我們無(wú)法證明界面在任意順序調(diào)用任意函數(shù)情況下,界面能夠真實(shí)有效的工作。因?yàn)樵诿钍讲僮飨?,無(wú)法同時(shí)執(zhí)行所有指令。

MVVM


MVVM是Model-View-ViewModel結(jié)構(gòu),在SwiftUI框架中使用。SwiftUI是響應(yīng)式編程(reactive programming)。

  • MVVM的Model與UI完全獨(dú)立,處理數(shù)據(jù)和邏輯的操作。數(shù)據(jù)流(data flows)在映射到視圖的過(guò)程中是只讀的。
  • MVVM的View是聲明式(declarative)視圖,我們?yōu)閁I聲明的方法,在任何時(shí)候做它們應(yīng)做的事情。不需要關(guān)心任何狀態(tài)變化(state changes),狀態(tài)在Model中記錄,View僅僅是映射Model中的數(shù)據(jù),Model變化帶來(lái)View變化,所見即所得。

Stuct結(jié)構(gòu)體中的代碼,實(shí)際上是只讀的,調(diào)用時(shí)不可能有其他人改變函數(shù)中的代碼,看到的就是聲明的。

  • ViewModel執(zhí)行解釋(interpreter)工作,將View綁定到Model上。ViewModel關(guān)注Model中的變化(notices changes),然后發(fā)布這些變化(publishes changed),訂閱(subscribes)了某個(gè)發(fā)布(publication)的View會(huì)進(jìn)行改變。

重要的一點(diǎn)是理解ViewModel沒有直接指向View的指針,不直接與View對(duì)話。如果View訂閱了某個(gè)發(fā)布,就會(huì)詢問(wèn)ViewModel怎么適應(yīng)現(xiàn)在的變化,這個(gè)過(guò)程不會(huì)回到Model,因?yàn)閂iewModel作用就是解釋Model的變化。

MVVM的Processes Intent

MVVM有一個(gè)對(duì)應(yīng)的關(guān)聯(lián)架構(gòu),是Model-View-Intent。如果用戶意圖(intent)做一些操作,那么這些Intent就要進(jìn)行View到Model這個(gè)反向傳遞過(guò)程。而swiftUI還沒有進(jìn)行這個(gè)設(shè)計(jì),所以我們用下面一系列操作來(lái)處理Intent:

  • View Calls Intent function 視圖調(diào)用方法
  • ViewModel modifies the Model 視圖模型修改模型
  • Model changes 模型改動(dòng)變化
  • ViewModel notices changes and publishes 模型關(guān)注到變化并發(fā)布
  • View whitch subscribes Reflect the Model 訂閱變化的視圖進(jìn)行模型映射

對(duì)比MVVM的映射過(guò)程,多了ViewModel處理View操作,并且修改Model這兩個(gè)操作。

總結(jié)


OC作為使用數(shù)十年的iOS第一開發(fā)語(yǔ)言,確實(shí)在現(xiàn)今各種新興前端語(yǔ)言中,顯得繁冗不堪。Swift在數(shù)年的時(shí)間內(nèi)逐漸迭代,替代OC已經(jīng)是不可阻擋的歷史浪潮。
哪怕OC這么強(qiáng)大的語(yǔ)言,不進(jìn)步也很快就要被淘汰了,何況我們只是時(shí)代的搬磚人呢,不斷學(xué)習(xí)新內(nèi)容是我們必須做的事情。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容