成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Model-View-ViewModel構(gòu)建iOS App

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

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

Model-View-Controller

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

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

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

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

還有控制器controller。Controller是app的“膠水代碼”:協(xié)調(diào)模型和視圖之間的所有交互。控制器負責管理他們所擁有的視 圖的視圖層次結(jié)構(gòu),還要響應視圖的loading、appearing、disappearing等等,同時往往也會充滿我們不愿暴露的model的模型 邏輯以及不愿暴露給視圖的業(yè)務邏輯。這引出了***個關(guān)于MVC的問題...

厚重的View Controller

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

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

遺失的網(wǎng)絡邏輯

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

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

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

較差的可測試性

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

定義模糊的“Manage”

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

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

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

Hey!現(xiàn)在有個點子...

Model-View-ViewModel

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

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

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

view model是一個放置用戶輸入驗證邏輯,視圖顯示邏輯,發(fā)起網(wǎng)絡請求和其他各種各樣的代碼的極好的地方。有一件事情不應歸入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技術(shù)參與到測試Core Data模型,但使用MVVM寫的app可以進行充分的單元測試。

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

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

關(guān)于怎么結(jié)合ReactiveCocoa來使用MVVM的信息,可以閱讀Colin Wheeler的excellent write-up或者看看我寫的開源app。你也可以閱讀我的關(guān)于ReactiveCocoa和MVVM的書

責任編輯:chenqingxiang 來源: cocoachina
相關(guān)推薦

2009-09-21 16:50:45

Model-View-

2013-07-31 13:13:50

Windows PhoMVVM模式

2017-07-20 11:18:22

Vue.jsMVVMMVC

2017-01-06 10:54:03

AndroidiOSJenkins

2010-04-09 09:28:37

View Model

2015-02-28 09:49:22

lua

2016-04-11 09:58:53

iOSJSONModel

2013-05-28 14:39:25

Android開發(fā)Android App

2015-09-23 10:30:44

iOS 9UIStack Vie

2016-12-07 09:27:11

KNIME大數(shù)據(jù)網(wǎng)絡

2021-11-23 10:25:35

性能優(yōu)化iOS App 啟動優(yōu)化

2016-07-01 14:43:32

DockerServerless

2014-11-18 10:37:15

dockerlinux技巧

2012-01-01 22:07:28

jQMjQuery MobiHTHL5

2011-07-22 18:20:04

IOS View 動畫

2015-01-17 13:28:59

線下公開課51CTO沙龍MDSA

2023-09-25 10:19:01

模型App開源

2011-03-14 14:19:52

VMware ViewiPadApp Store

2015-08-07 09:33:24

RuntimeModel

2020-07-16 21:00:05

樹莓派Kubernetes集Linux
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: chengrenzaixian | 99久久精品免费视频 | 欧美一级特黄aaa大片在线观看 | 亚洲综合字幕 | 久久九九色 | 夜夜夜夜夜夜曰天天天 | 成人精品一区二区三区 | av在线成人 | 中文字幕 在线观看 | 亚洲综合色视频在线观看 | 国产999精品久久久久久 | 三级免费网 | 日韩精品一区在线观看 | 91激情电影 | 亚洲精品久久久久久久久久久 | 99re在线播放 | 欧美精品首页 | 黄色av网站免费看 | 亚洲精品美女 | 天堂网中文字幕在线观看 | 成人欧美一区二区三区视频xxx | 日一区二区 | 久久久久久黄 | 日韩在线视频免费观看 | 一区二区三区四区电影视频在线观看 | 久久av综合 | 日韩激情一区 | 亚洲精色| 超碰日韩 | 欧洲精品在线观看 | 国产色| 黄色片在线观看网址 | 伊人免费在线观看 | a免费视频 | 国产a级毛毛片 | 成人精品国产 | 91日日| 午夜视频免费在线观看 | www..99re | 色综合一区二区 | 国产精品久久久久久妇女6080 |