SwiftUI內(nèi)功之iOS和macOS的MVVM
自從SwiftUI引入以來(lái),MVVM模式已經(jīng)有了新的復(fù)興戚丸。許多開發(fā)人員認(rèn)為划址,這種特定模式非常適合SwiftUI數(shù)據(jù)流。
MVVM當(dāng)然有一些好主意限府,但是它也帶來(lái)了由于對(duì)模式及其剛性的各種不一致的解釋而引起的問(wèn)題夺颤。
在本文中,我們將了解MVVM如何適合使用SwiftUI編寫的iOS應(yīng)用程序胁勺,如何利用其優(yōu)勢(shì)以及如何避免其問(wèn)題世澜。
一、MVVM如何改善iOS應(yīng)用程序的結(jié)構(gòu)
MVVM是一種架構(gòu)模式署穗,可幫助您構(gòu)建iOS應(yīng)用程序寥裂。盡管它是MVC的派生嵌洼,但它體現(xiàn)了一些獨(dú)特的想法,這些想法與SwiftUI應(yīng)用程序的工作方式非常吻合封恰。
(一) MVVM模式的結(jié)構(gòu)及其各層的作用
MVVM是MVC模式的變體麻养。與MVC一樣,Model-View-ViewModel模式(簡(jiǎn)稱MVVM)是一種體系結(jié)構(gòu)模式诺舔,指導(dǎo)您如何在iOS應(yīng)用程序中構(gòu)建代碼鳖昌。MVVM由三層組成,并以此命名混萝。
每層在應(yīng)用程序的結(jié)構(gòu)中都有明確定義的角色遗遵,有助于您將關(guān)注點(diǎn)進(jìn)行分離萍恕。
- 在模型層中逸嘀,我們找到了代表您應(yīng)用程序數(shù)據(jù)及其域業(yè)務(wù)邏輯的Swift類型。
- 該視圖層是用戶看到屏幕上的內(nèi)容允粤。在iOS中崭倘,它包含您的應(yīng)用程序的SwiftUI視圖,該視圖顯示信息并允許用戶交互类垫。
- 最后司光,視圖模型將視圖連接到應(yīng)用程序的模型。視圖模型包含視圖的當(dāng)前狀態(tài)悉患,鏈接到應(yīng)用程序體系結(jié)構(gòu)的其他部分(例如残家,數(shù)據(jù)存儲(chǔ)或網(wǎng)絡(luò)),并處理用戶的交互售躁。
MVVM模式并非iOS獨(dú)有坞淮。實(shí)際上,它是由Microsoft架構(gòu)師(所有人)發(fā)明的陪捷。在首款iPhone發(fā)行僅數(shù)年后回窘,它便進(jìn)入了iOS應(yīng)用程序。
傳統(tǒng)上市袖,Apple遵循macOS和iOS應(yīng)用程序的MVC模式啡直。隨著SwiftUI的引入,情況發(fā)生了變化苍碟。
(二) MVVM使用活頁(yè)夾來(lái)連接視圖和視圖模型
從MVC模式圖來(lái)看蹂安,實(shí)際上涎永,MVVM是相同的模式并不是重新發(fā)明的概念。因此,盡管我同時(shí)使用兩種模式的思想痹升,但我通常以MVC來(lái)談?wù)摷軜?gòu)。
與MVC最為關(guān)鍵的區(qū)別是MVVM使用綁定器連接視圖和視圖模型層鳞骤。這將在兩層之間同步數(shù)據(jù),從而刪除樣板代碼继效。
這是SwiftUI的自然部分。
在UIKit中装获,開發(fā)人員使用了RxSwift之類的FRP框架瑞信。相反,SwiftUI在后臺(tái)使用Apple的本機(jī)反應(yīng)框架Combine穴豫。但是您無(wú)需學(xué)習(xí)Combine即可制作SwiftUI應(yīng)用凡简。
因此,在SwiftUI中精肃,MVVM和MVC之間最明顯的區(qū)別已經(jīng)消失了秤涩。連接對(duì)象和視圖只有一種方法:
- 對(duì)象必須符合 ObservableObject協(xié)議。
- 這樣的對(duì)象必須使用@Published屬性包裝器公開任何影響用戶界面的 屬性司抱。
- 視圖通過(guò)@ StateObject筐眷, @ObservedObject和 @EnvironmentObjects屬性包裝器連接到觀察到的對(duì)象 。