iOS設計模式 MVVM

2021-07-10 21:19:20 字數 2746 閱讀 4714

原文**:

如果你已經開發ios應用程式有一段時間了,那麼你可能聽說過mvvm或者mvc(設計模式)。這是你構建ios應用程式的標準模式。然而,最近,我越來越厭倦mvc的一些缺點了。在這篇文章中,我要梳理一下什麼是mvc,及其缺點,並告訴你乙個新的方式來組織你的應用程式:(那就是)mvvm。

model-view-controller--mvc(模型-檢視-控制器)

在**裡,檢視作為通知任何使用者互動的控制器。然後檢視控制器更新模型來體現狀態的變化。然後該模型(通常是通過鍵 - 值觀察)通知所有控制器,他們需要對自己的檢視進行更新。這種協調方式構成了很多寫在ios應用程式裡面的**。

模型物件通常是非常,非常簡單的。很多時候,

他們是核心資料管理物件,或者,如果你比較喜歡避開核心資料和其他普遍的模型。更具蘋果的說法,模型用包含的資料和邏輯來處理這些資料。在實踐中,模型往往很稀疏,不管這樣是好是壞,控制器得到了模型的邏輯。

檢視(通常情況下)是uikit元件或者程式設計師定義的uikit元件集合其中之一。他們通常拼湊到你的.xib或者.storyboard中:視覺和應用程式互動的元件。按鈕。標籤。你有乙個想法,檢視應該永遠不會被模型直接引用,控制器應該只通過ibaction觸發事件。不屬於檢視本身的業務邏輯不應該在那裡。

就這樣我們捨棄了控制器。控制器是乙個應用程式的「粘合劑**」:它在模型和檢視之間協調所有的互動,控制器負責管理他們自己檢視的檢視層次結構。他們響應檢視的載入,出現,消失等等。他們傾向於用模型邏輯來裝載,我們避免我們的模型和業務邏輯遠離我們的觀點。這是我們與mvc的第乙個問題…

大規模的檢視控制器

因為在檢視控制器中放置的**量非常大,他們往往會變得很臃腫,在ios中有的檢視控制器中的**,可能會延展至成千上萬**行。你應用程式中這些臃腫的片段權衡下來:大規模的檢視控制器都難以維持(因為他們的規模太龐大),其中含有很多屬性,會讓他們的狀態很難被管理,又符合許多協議,混合了協議的響應**與控制器的邏輯。

大規模的檢視控制器是很難測試的,不管是手動測試還是單元測試,因為他們有很多可能的狀態。把你的**分割的更少,更小更簡單通常是一件很好的事情。

缺少網路邏輯

mvc的定義 - 蘋果使用的那個 - 規定所有物件可以被分類為乙個型別,乙個檢視,或者乙個控制器。所有這些。所以,你應該吧網路**放在**呢?而**與api的通訊又在**呢?

你可以試著巧妙的把它放在模型物件裡,但是這麼做可能會變得很棘手,因為網路呼叫應該是非同步的過程。所以,如果乙個網路請求會超越擁有它的模型,好吧,它變複雜了。你絕對不應該把網路**放進檢視裡,所以…應該留給控制器來處理。這是乙個不好的想法,因為它會促使我們產生大規模的檢視控制器這個問題。

那麼,在**呢?對於**來說,mvc的這三個組成部分沒有乙個地方不適合**。

mvc還有另外乙個大問題就是,它不鼓勵開發者編寫測試用例。自從檢視控制器檢視操作邏輯與業務邏輯混合,把這些單元測試分開就成了一項艱鉅的任務。都贊成忽視這個任務(單元測試)…所以就沒有測試任何東西。「m

anage

」 的模糊定義

我前面提到的那個檢視控制器來管理檢視層次的部分,檢視控制器有乙個「檢視」屬性,並且可以通過iboutlets訪問該檢視的子檢視。

這樣的擴充套件就不太好,因為

當你有很多outlets時,並且在某些時候,你可能還是使用子檢視控制器去管理你所有的子檢視會更好。

那麼在**呢?他什麼時候會有益於把事物分割和細化呢?請問,業務邏輯是否會驗證使用者的輸入屬於控制器,或者屬於模型?

這裡有很多模糊的線,似乎沒有人能完全同意。當你畫這些線的時候似乎沒有問題,檢視和其相應的控制器變得如此緊密而且耦合,那你還不如把他們看作是乙個元件。

嘿!現在有乙個主意…

在乙個理想的世界,mvc可以很好的工作,然而,我們生活在乙個真實的世界,事實也並非如此。現在,我們已經詳細介紹了

mvc打破典型用法的方法,讓我們來看看另一種:模型

- 檢視

-檢視模型。

mvvm來自微軟,

但不要堅決反對使用它。

mvvm和mvc

非常相似

。它讓檢視和控制器具有一定形式的緊密耦合的性質,並且還引入了乙個新的元件。

在mvvm

,檢視和檢視控制器正式形成連線;我們把他們作為乙個元件。檢視仍然沒有對模型進行引用,但是也沒有引用控制器。相反的,他們引用檢視模型。

檢視模型是作為使用者輸入驗證邏輯的好地方,通過檢視呈現邏輯,附加的網路請求,和其他複雜的**。有一件事是,檢視本身在檢視模型中不屬於任何檢視的引用。檢視模型中的這個邏輯對於

ios和os x中應該是同樣適用的。(換一種說法,不要在你的檢視模型中#import uikit.h,你會被罰款的)。

由表現邏輯,比如對映乙個模型值去格式化乙個東西--屬於檢視模型中,檢視控制器本身會變得很大,但是並非臃腫。最好的部分是當你使用mvvm,你可以放置一小部分邏輯在你的檢視模型中,當你成為越來越適合的範例時再把它們遷移過來。

使用mvvm

編寫的ios

應用程式是高度可測試的;因為檢視模型包含了所有的演示邏輯並且不引用這個檢視,它可以通過程式設計進行全面測試。雖然很多黑客參與測試core data模型,但是使用

mvvm

編寫的應用程式完全可以進行單元測試。

在我的經驗中,使用

mvvm

的結果是,**的總量略有增加,但在**的複雜性部分整體下降。這是

乙個權衡過後很核算的方法。

如果你再回頭看看mvvm**,你會發現,我用了模稜兩可的動詞「通知」和「更新」,但是沒有支出應該怎麼做。你可以用kvo,就像mvc,但是很快就會變得很難管理。在實踐中,使用reactivecocoa是把所有模組粘合在一起的乙個好方法。

剖析iOS設計模式MVVM

眾所周知,物件導向,是由面向過程演變而來,於是有了設計模式。客服端程式設計離不開mvc model view controller 設計模式,由於複雜頁面 如微博列表,存在使用者表頭,內容cell存在多型及變高,多種操作交雜的情況 把頁面展示,及操作都放在viewcontroller裡進行管理,勢必...

iOS中的MVVM設計模式

經過這幾天的翻閱資料與 的實現,終於對mvvm設計模式有了明確的了解,分享給大家 一 什麼是mvvm設計模式?mvvm 於微軟。是一種 的分層方式,更是一種思想。mvvm 基本上就是 mvc 的改進版。二 如何正確的使用mvvm設計模式?結構 在建立目錄的時候一樣,每一層放在乙個單獨的資料夾,m m...

MVVM設計模式

mvvm是model view viewmodel的簡寫。微軟軟體 ui層更加細節化 可定製化。同時,在技術層面,wpf也帶來了 諸如binding dependency property routed events command datatemplate controltemplate等新特性。...