亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Model-View-ViewModelforiOS[譯]

2019-11-14 20:16:14
字體:
來源:轉載
供稿:網友

如果你已經開發一段時間的iOS應用,你一定聽說過Model-View-Controller, 即MVC。MVC是構建iOS app的標準模式。然而,最近我已經越來越厭倦MVC的一些缺點。在本文,我將重溫一下MVC是什么,詳述它的缺點,并且告訴你一個新的方式來架構你的app:Model-View-ViewModel。拿出你的流行語bingo card(賓果卡,一種游戲卡片-譯者注),因為我們即將進行一次范式轉變。

Model-View-Controller

Model-View-Controller是一個用來組織代碼的權威范式。Apple甚至是這么說的。在MVC下,所有的對象被歸類為一個model,一個view,或一個controller。Model持有數據,View顯示與用戶交互的界面,而view controller調解model和view之間的交互。

MVC

在上圖中,view將用戶交互通知給controller。view controller通過更新model來反應狀態的改變。model(通常使用Key-Value-Observation)通知controller來更新他們負責的view。大多數iOS應用程序的代碼使用這種方式來組織。

模型model的對象通常非常非常的簡單。很多時候,他們就是Core Data managed objects,或者避免使用Core Data,就是其他流行的數據模型層。根據Apple的文檔,model包括數據和操作數據的業務邏輯。在實踐中,model層往往非常薄,不管怎樣,model層的業務邏輯被拖入了controller。

視圖view通常是UIKit控件(component,這里根據習慣譯為控件)或者編碼定義的UIKit控件的集合。進入.xib或者Storyboard會發現一個app、Button、Label都是由這些可視化的和可交互的控件組成。你懂的。View不應該直接引用model,并且僅僅通過IBAction事件引用controller。業務邏輯很明顯不歸入view,視圖本身沒有任何業務。

還有控制器controller。Controller是app的“膠水代碼”:協調模型和視圖之間的所有交互??刂破髫撠煿芾硭麄兯鶕碛械囊晥D的視圖層次結構,還要響應視圖的loading、appearing、disappearing等等,同時往往也會充滿我們不愿暴露的model的模型邏輯以及不愿暴露給視圖的業務邏輯。這引出了第一個關于MVC的問題...

厚重的View Controller

由于大量的代碼被放進view controller,導致他們變的相當臃腫。在iOS中有的view controller里綿延成千上萬行代碼的事并不是前所未見的。這些超重app的突出情況包括:厚重的View Controller很難維護(由于其龐大的規模);包含幾十個屬性,使他們的狀態難以管理;遵循許多協議(PRotocol),導致協議的響應代碼和controller的邏輯代碼混淆在一起。

厚重的view controller很難測試,不管是手動測試或是使用單元測試,因為有太多可能的狀態。將代碼分解成更小的多個模塊通常是件好事。

遺失的網絡邏輯

蘋果使用的MVC的定義是這么說的:所有的對象都可以被歸類為一個model,一個view,或是一個controller。就這些。那么把網絡代碼放哪里?和一個API通信的代碼應該放在哪兒?

你可能試著把它放在model對象里,但是也會很棘手,因為網絡調用應該使用異步,這樣如果一個網絡請求比持有它的model生命周期更長,事情將變的復雜。顯然也不應該把網絡代碼放在view里,因此只剩下controller了。這同樣是個壞主意,因為這加劇了厚重View Controller的問題。

那么應該放在那里呢?顯然MVC的3大組件根本沒有適合放這些代碼的地方。

較差的可測試性

MVC的另一個大問題是,它不鼓勵開發人員編寫單元測試。由于view controller混合了視圖處理邏輯和業務邏輯,分離這些成分的單元測試成了一個艱巨的任務。大多數人選擇忽略這個任務,那就是不做任何測試。

定義模糊的“Manage”

之前我提到了view controller可以管理試圖的層次結構;view controller有一個“view”屬性,并且可以通過IBOutlet訪問視圖的任何子視圖。當有很多outlet時這樣做不易于擴展,在某種意義上,最好不要使用子視圖控制器(child view controller)來幫助管理子視圖(subview)。

要點在哪?驗證用戶輸入的業務邏輯應歸入controller還是model呢?

在這里有多個模糊的標準,似乎沒有人能完全達成一致。貌似無論如何,view和對應的controller都緊緊的耦合在一起,總之,還是會把它們當成一個組件來對待。

Hey!現在有個點子...

Model-View-ViewModel

在理想的世界里,MVC也許工作的很好。然而,我們生活在真實的世界。既然我們已經詳細說明了MVC在典型場景中的問題,那讓我們看一看一個可供替換的選擇:Model-View-ViewModel。

MVVM來自微軟,不過不要堅持反對它。MVVM和MVC很像。它正式規范了視圖和控制器緊耦合的性質,并引入新的組件。

MVVM

在MVVM里,view和view controller正式聯系在一起,我們把它們視為一個組件。視圖view仍然不能直接引用模型model,當然controller也不能。相反,他們引用視圖模型view model。

view model是一個放置用戶輸入驗證邏輯,視圖顯示邏輯,發起網絡請求和其他各種各樣的代碼的極好的地方。有一件事情不應歸入view model,那就是任何視圖本身的引用。view model的概念同時適用于于iOS和OS X。(換句話說,不要在view model中使用 #import UIKit.h)

由于展示邏輯(presentation logic)放在了view model中(比如model的值映射到一個格式化的字符串),視圖控制器本身就會不再臃腫。當你開始使用MVVM的最好方式是,可以先將一小部分邏輯放入視圖模型,然后當你逐漸習慣于使用這個范式的時候再遷移更多的邏輯到視圖模型中。

使用MVVM的iOS app是高度可測試的;因為view model包含了所有的展示邏輯并且不會引用view,所以它可以通過編程方式充分測試。雖然有眾多的hack技術參與到測試Core Data模型,但使用MVVM寫的app可以進行充分的單元測試。

以我的經驗,使用MVVM會輕微的增加代碼量,但總體上減少了代碼的復雜性。這是一個劃算的交易。

回過頭再來看MVVM的圖示,你會注意到我使用了模糊的動詞“notify”和“update”,而沒有詳細說明該怎么做。你可以使用KVO,就像MVC那樣,但這很快就會變得難以管理。事實上,使用ReactiveCocoa會是更好的方式來組織各個部分。

關于怎么結合ReactiveCocoa來使用MVVM的信息,可以閱讀Colin Wheeler的Excellent write-up或者看看我寫的開源app。你也可以閱讀我的關于ReactiveCocoa和MVVM的書.

原文鏈接

Model-View-ViewModel for iOS by Ash Furrow

延伸閱讀


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区在线观看网站| 久久久精品免费视频| 欧美国产日产韩国视频| 欧美精品www在线观看| www.欧美免费| 久久精品国产免费观看| 久久精品美女视频网站| 欧美日韩在线一区| 国产精品福利小视频| 日韩av电影手机在线观看| 国产精品久久久久久av| 国产欧美一区二区三区在线看| 亚洲精品一区二区久| 成人精品视频99在线观看免费| 亚洲图片欧美日产| 黑人巨大精品欧美一区二区免费| 亚洲美女视频网| 中文字幕精品在线| 俺也去精品视频在线观看| 国产91色在线免费| 欧美在线观看网站| 精品日本美女福利在线观看| 精品久久久久久亚洲国产300| 亚洲成色777777女色窝| 久热在线中文字幕色999舞| 欧美国产高跟鞋裸体秀xxxhd| 久久精品在线视频| 2021国产精品视频| 久久久久久一区二区三区| 8x海外华人永久免费日韩内陆视频| 久久九九免费视频| 日韩精品免费观看| 在线日韩日本国产亚洲| 欧美最顶级丰满的aⅴ艳星| 国产精品成人观看视频国产奇米| 欧美亚洲成人xxx| 亚洲成人精品av| 国产精品无av码在线观看| 中文字幕国产日韩| 国产精品视频男人的天堂| 91精品国产高清久久久久久91| 欧美怡红院视频一区二区三区| 国产视频自拍一区| 一个人看的www欧美| 性日韩欧美在线视频| 亚洲欧美日韩区| 久久久久久久电影一区| 精品一区电影国产| 2019中文字幕在线观看| 国产精品免费看久久久香蕉| 色综合久久精品亚洲国产| 日韩视频在线一区| 成人观看高清在线观看免费| 久久久久久999| 亚洲偷熟乱区亚洲香蕉av| 久久精品国产电影| 国产成人精品一区二区三区| 欧美激情亚洲自拍| 亚洲一区中文字幕| 亚洲人成电影在线播放| 欧美一区三区三区高中清蜜桃| 中文字幕日韩在线视频| 欧美国产第二页| 国产69精品久久久| 欧美区在线播放| 日韩免费在线电影| 91成人国产在线观看| 国内偷自视频区视频综合| 久久久久久久网站| 国产精品羞羞答答| 青草青草久热精品视频在线网站| 8090理伦午夜在线电影| 国产精品久久久久久久久久久久久| 亚洲码在线观看| 久久久国产精品视频| 中文字幕九色91在线| 欧美久久久精品| 亚洲欧美国产视频| 国产性猛交xxxx免费看久久| 欧美电影在线免费观看网站| 国内精品一区二区三区| 欧美三级欧美成人高清www| 亚洲第一区第一页| 久久久久国产精品一区| 国产精品久久久久91| 97精品一区二区三区| 久热精品视频在线免费观看| 国内精品久久久久| 中文字幕av一区二区| 亚洲石原莉奈一区二区在线观看| 青青在线视频一区二区三区| 久久影院在线观看| 国产精品日韩欧美大师| 亚洲人成啪啪网站| 亚洲综合社区网| 俺去了亚洲欧美日韩| 91美女片黄在线观| 亚洲人成网站色ww在线| 国产精品日韩欧美大师| 一区二区三区高清国产| 欧美在线播放视频| 久久久爽爽爽美女图片| 久久久久久成人| 亚洲第一色中文字幕| 欧美福利小视频| 粉嫩av一区二区三区免费野| 亚洲男人天堂网| 国产精品久久视频| 欧美日韩不卡合集视频| 日韩美女激情视频| 国产精品pans私拍| 午夜伦理精品一区| 国产精品久久久久久久久久免费| 成人女保姆的销魂服务| 午夜精品久久久久久久99热浪潮| 亚洲自拍小视频| 久久久久久这里只有精品| 精品国模在线视频| 欧美成年人视频| 成人做爰www免费看视频网站| 亚洲区在线播放| 亚洲人成在线播放| 国产一区二区三区视频在线观看| 中文字幕最新精品| 草民午夜欧美限制a级福利片| 久久久久久国产免费| 久久精品久久久久| 国产69精品久久久久99| 国产精品视频网址| 亚洲国产91精品在线观看| 欧美视频精品一区| 亚洲免费福利视频| 久久久免费电影| 亚洲毛片在线看| 国产精品高精视频免费| 国产一区二区三区直播精品电影| 91精品国产91久久| 欧美激情a∨在线视频播放| 亚洲缚视频在线观看| 福利视频导航一区| 亚洲国产91色在线| 亚洲精选中文字幕| 91精品视频播放| 精品国产欧美一区二区五十路| 中文字幕av一区| 亚洲美女动态图120秒| 午夜精品一区二区三区av| 欧美一级淫片丝袜脚交| 日韩激情视频在线播放| 午夜精品在线观看| 欧美激情一区二区久久久| 国产成人精品电影| 97av在线视频| 中文字幕精品—区二区| 久久久成人精品| 亚洲一区亚洲二区| 日本精品久久电影| 久久不射热爱视频精品| 国产经典一区二区| 国产免费久久av| 欧美日本在线视频中文字字幕| 日韩精品中文字幕有码专区| 亚洲a在线播放| 亚洲国产成人久久综合一区|