【移動(dòng)應(yīng)用開發(fā)技術(shù)】iOS框架MVC+MVVM結(jié)合的實(shí)戰(zhàn)_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】iOS框架MVC+MVVM結(jié)合的實(shí)戰(zhàn)_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】iOS框架MVC+MVVM結(jié)合的實(shí)戰(zhàn)_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】iOS框架MVC+MVVM結(jié)合的實(shí)戰(zhàn)

框架對(duì)整個(gè)應(yīng)用程序的作用非常重要,記得有個(gè)朋友說過:用什么框架啊,好好封裝一下不就行了嗎?但我的理解是,好的封裝絕對(duì)可以事半功倍,但是如果不按照一定的規(guī)則進(jìn)行封裝就會(huì)讓人有些難以理解了,維護(hù)代碼的人要瘋掉了,我認(rèn)為架構(gòu)就是規(guī)定怎么去封裝的。

在拜讀的大神們對(duì)框架的構(gòu)思之后,我決定在我們的項(xiàng)目中進(jìn)行實(shí)踐一下。剛到了一家新公司,公司的代碼極爛,沒有什么設(shè)計(jì)思想,最終導(dǎo)致controller類的代碼達(dá)到2000行,最多的三千行,非常不利于代碼的復(fù)用,本來極為類似的界面,繼承一下就可以搞定的東西,竟然實(shí)現(xiàn)了兩次,可以公共使用的東西就更多了,所以激起了我對(duì)代碼進(jìn)行優(yōu)化的想法。

我們的程序是運(yùn)行于iPad上的,所以每個(gè)viewcontroller的控件和事件比較多,導(dǎo)致的代碼集中到了VC上,讀過被誤解的MVC和被神化的MVVM后,決定使用優(yōu)化過后的MVC。

View,就像大神的分析view是一個(gè)層,可能有多個(gè)類組成,我們的界面以前是storyboard編寫的,我不準(zhǔn)備用用純代碼實(shí)現(xiàn)一遍,于是加了個(gè)viewUtil的類,讓所有的view上的屬性也作為viewutil的屬性,這個(gè)類我準(zhǔn)備用來監(jiān)聽viewModel(借鑒MVVM)的屬性,一旦viewModel的屬性進(jìn)行改變,view也要進(jìn)行改變,view的改變就在viewUtil類中進(jìn)行實(shí)現(xiàn)。這樣view這一層(初始化和改變狀態(tài))有了處理的地方了。

ViewModel,借鑒MVVM可以讓架構(gòu)的思路更清晰。我們平時(shí)用于數(shù)據(jù)傳輸?shù)膍odel用來存放網(wǎng)絡(luò)上請(qǐng)求過來的數(shù)據(jù)的,不一定和頁(yè)面上的元素一一對(duì)應(yīng)。比如頁(yè)面上有個(gè)開關(guān),用于控制某個(gè)東西的顯示和隱藏的,model里不會(huì)存放,這個(gè)時(shí)候我們?cè)趘iewModel創(chuàng)建一個(gè)bool屬性showSth,就是將一個(gè)頁(yè)面所有的可變?cè)睾蛌iewModel的屬性一一對(duì)應(yīng),這樣我們?cè)趘iewcontroller里修改了showSth=YES;由于view監(jiān)聽了viewModel的這個(gè)屬性,讓某個(gè)東西顯示了。這樣邏輯就變的清晰了,界面轉(zhuǎn)化成了具體的屬性來操控。

viewModel也是用來存放數(shù)據(jù)(例如網(wǎng)絡(luò)請(qǐng)求的結(jié)果數(shù)組)和處理邏輯(排個(gè)序什么的)的地方,但是不包括網(wǎng)絡(luò)請(qǐng)求,因?yàn)榫W(wǎng)絡(luò)請(qǐng)求也放到viewModel里的話,viewModel就會(huì)變成第二個(gè)viewcontroller,不利于對(duì)程序流程的掌控,還有就是大量的代碼從viewcontroller轉(zhuǎn)移到了viewModel。

viewController,viewcontroller還是用來接收所有交互的,只不過做了一個(gè)中轉(zhuǎn)作用(至于如何做中轉(zhuǎn),下面會(huì)有介紹),交給其他的類進(jìn)行處理,這么做可以減少viewcontroller里的代碼,又可以把所有的交互處理集中到了一個(gè)地方,可以方便調(diào)試快速找到問題。

Service,這個(gè)類處理網(wǎng)絡(luò)請(qǐng)求,做成功和失敗的判斷處理,還可以加工數(shù)據(jù)把數(shù)據(jù)加工成viewModel類所需要的類型,比如數(shù)組包含相應(yīng)類型的Model之類的。

Model,數(shù)據(jù)存儲(chǔ)的類,就是我們平時(shí)使用的Model,可以進(jìn)行數(shù)據(jù)持久化的處理。

所以一個(gè)完整的交互流程大概是這個(gè)樣子,例如view接收到了點(diǎn)擊某個(gè)按鈕的事件,view用代理回調(diào)給viewcontroller做處理,比如要去請(qǐng)求來數(shù)據(jù)進(jìn)行展示,就調(diào)用service類進(jìn)行網(wǎng)絡(luò)請(qǐng)求,返回結(jié)果后又會(huì)回到viewcontroller里,然后viewcontroller將數(shù)據(jù)賦值給viewModel的屬性dataSourceArray里面,這個(gè)時(shí)候由于view監(jiān)聽了dataSourceArray這個(gè)屬性,view就會(huì)直接調(diào)用tableView進(jìn)行刷新。這樣就是這個(gè)架構(gòu)的交互流程。

將view和view的刷新放到view層,網(wǎng)絡(luò)請(qǐng)求進(jìn)行獨(dú)立,viewcontroller處理所有的東西,viewModel處理運(yùn)算邏輯等和對(duì)頁(yè)面的元素進(jìn)行表示和控制,這是整個(gè)架構(gòu)基本的對(duì)類職責(zé)進(jìn)行規(guī)定。

為什么不在請(qǐng)求成功后讓viewcontroller直接調(diào)用view的方法進(jìn)行更新呢,你也可以這么做,由于我對(duì)框架的理解不夠深刻,所以只能這么回答。

如果閑tableView礙事就可以這么處理:將UITableView的DataSource分離到另外一個(gè)類中。別人總結(jié)的方法,還沒進(jìn)行實(shí)踐,只是感覺這么分下去有點(diǎn)更亂了。等有時(shí)間實(shí)踐下。

我們的項(xiàng)目中有個(gè)viewcontroller是從1500行減少到800行,雖然較少的不是太多,但是感覺邏輯更清晰了,新增的東西會(huì)有一個(gè)明確的地方處理,感覺更規(guī)范了。

最后感覺架構(gòu)的使用還是分項(xiàng)目和分頁(yè)面的,比較簡(jiǎn)單的界面不用什么

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論