一看就懂的極簡MVVM

2021-09-24 06:39:38 字數 1738 閱讀 6126

model-view-viewmodel(mvvm)是基於mvc的變形的一種設計模式,它由model、view、viewmodel三部分組成,三部分的職責如下:

view:負責顯示在螢幕上的視覺化元素,通常是uiview的子類。

viewmodel:負責將model中的資料轉化為view上顯示的資料。它們通常是class,這樣它們就可以通過引用指標來傳遞。

具體邏輯如下圖:

當我們在專案初創時期,用mvc搭建專案是沒有問題的。但是隨著專案業務越來越多,越來越複雜的時候,我們會發現controller裡面的東西會非常的多,它通常會包含:controller的生命週期函式、檢視的響應事件、遠端資料的獲取,資料的變形,各種邏輯的判斷等等。這樣會導致**閱讀性下降,bug率提公升。這也是為什麼大家調侃mvc為massive-view-controller的原因。

在這個背景下就誕生了mvvm設計模式來解決massive controller的問題,在使用mvvm的模式時,我們可以把資料轉換、資料邏輯判斷放在viewmodel裡,以此來減輕controller的負擔。

1、首先我們新建乙個專案,建立乙個person.swift檔案來表示使用者的資料:

//定義乙個包含使用者名字、頭像和註冊時間的結構體當做使用者的model

struct person

複製**

2、接下來我們建立負責轉換model的viewmodel-personviewmodel.swift:

// name 和 image 只是簡單的通過兩個計算屬性來接受

// 將時間戳的註冊時間轉換為字串的註冊時間

class personviewmodel

private var image: string

private var registertimestr: string

init(_ person: person)

}複製**

3、建立展示使用者資訊的personview.swift:

class personview: uiview 

required init?(coder adecoder: nscoder)

}複製**

4、最後一步,在controller中將它們連線起來:

class viewcontroller: uiviewcontroller 

func setupsubviews

()

func requestdata

() }

複製**

好啦,到現在為止你已經實踐了mvvm的設計模式,如果不出意外的話你會在你的模擬器上顯示乙個展示使用者資訊的view,如下圖: 。

5、當然,我們可以把給view賦值的語句放在personviewmodel,這樣可以使**更加解耦。

// 在personviewmodel 最下方 新增

extension personviewmodel

}// 將 viewcontroller裡的requestdata()的**更新為下面的**

func requestdata

() 複製**

當你的專案業務比較簡單的時候還是推薦使用mvc架構,當業務比較複雜的時候可以轉為mvvm架構。

一看就懂的SwitchHosts

switchhosts 是乙個管理 切換多個 hosts 方案的工具。它是乙個免費開源軟體。日常開發工作中,我們可能經常需要切換各種 hosts 繫結,比如在本地開發時可能需要乙個開發環境的 hosts 繫結方案,發布到測試環境後又有乙個測試環境的 hosts 繫結方案,然後可能還有乙個預發布環境,...

一看就懂TCP 連線

我們先來看乙個定義。這樣理解比較抽象。我們換個角度。它的本質還是傳輸控制。如果讓我們自己設計這個傳輸,我們會怎麼想呢。tcp 協議它會先建立連線。三次握手目的是保證雙方都有傳送和接收的能力 首要原因是為了防止舊的重複連線初始化造成混亂。同步雙方初始序列號客戶端和服務端都處於 closed 狀態。先是...

資訊熵 一看就懂

先給出資訊熵的公式 首先了解一下資訊量 資訊量是對資訊的度量,就跟時間的度量是秒一樣,當我們考慮乙個離散的隨機變數 x 的時候,當我們觀察到的這個變數的乙個具體值的時候,我們接收到了多少資訊呢?多少資訊用資訊量來衡量,我們接受到的資訊量跟具體發生的事件有關。資訊的大小跟隨機事件的概率有關。越小概率的...