iOS架構MVC+MVVM結合的實戰

來源:互聯網
上載者:User

標籤:mvc   ios   mvvm   架構   

    架構對整個應用程式的作用非常重要,記得有個朋友說過:用什麼架構啊,好好封裝一下不就行了嗎?但我的理解是,好的封裝絕對可以事半功倍,但是如果不按照一定的規則進行封裝就會讓人有些難以理解了,維護代碼的人要瘋掉了,我認為架構就是規定怎麼去封裝的。

    

    在拜讀的大神們對架構的構思之後,我決定在我們的項目中進行實踐一下。剛到了一家新公司,公司的代碼極爛,沒有什麼設計思想,最終導致controller類的代碼達到2000行,最多的三千行,非常不利於代碼的複用,本來極為類似的介面,繼承一下就可以搞定的東西,竟然實現了兩次,可以公用使用的東西就更多了,所以激起了我對代碼進行最佳化的想法。


    我們的程式是運行於iPad上的,所以每個viewcontroller的控制項和事件比較多,導致的代碼集中到了VC上,讀過被誤解的 MVC 和被神化的 MVVM後,決定使用最佳化過後的MVC。


    View,就像大神的分析view是一個層,可能有多個類組成,我們的介面以前是storyboard編寫的,我不準備用用純程式碼實現一遍,於是加了個viewUtil的類,讓所有的view上的屬性也作為viewutil的屬性,這個類我準備用來監聽viewModel(借鑒MVVM)的屬性,一旦viewModel的屬性進行改變,view也要進行改變,view的改變就在viewUtil類中進行實現。這樣view這一層(初始化和改變狀態)有了處理的地方了。


    ViewModel,借鑒MVVM可以讓架構的思路更清晰。我們平時用於資料轉送的model用來存放網路上請求過來的資料的,不一定和頁面上的元素一一對應。比如頁面上有個開關,用於控制某個東西的顯示和隱藏的,model裡不會存放,這個時候我們在viewModel建立一個bool屬性showSth,就是將一個頁面所有的可變元素和viewModel的屬性一一對應,這樣我們在viewcontroller裡修改了showSth=YES;由於view監聽了viewModel的這個屬性,讓某個東西顯示了。這樣邏輯就變的清晰了,介面轉化成了具體的屬性來操控。

        viewModel也是用來存放資料(例如網路請求的結果數組)和處理邏輯(排個序什麼的)的地方,但是不包括網路請求,因為網路請求也放到viewModel裡的話,viewModel就會變成第二個viewcontroller,不利於對程式流程的掌控,還有就是大量的代碼從viewcontroller轉移到了viewModel。


    viewController, viewcontroller還是用來接收所有互動的,只不過做了一個中轉作用(至於如何做中轉,下面會有介紹),交給其他的類進行處理,這麼做可以減少viewcontroller裡的代碼,又可以把所有的互動處理集中到了一個地方,可以方便調試快速找到問題。

    

    Service,這個類處理網路請求,做成功和失敗的判斷處理,還可以加工資料把資料加工成viewModel類所需要的類型,比如數組包含相應類型的Model之類的。


    Model,資料存放區的類,就是我們平時使用的Model,可以進行資料持久化的處理。


    所以一個完整的互動流程大概是這個樣子,例如view接收到了點擊某個按鈕的事件,view用代理回調給viewcontroller做處理,比如要去請求來資料進行展示,就調用service類進行網路請求,返回結果後又會回到viewcontroller裡,然後viewcontroller將資料賦值給viewModel的屬性dataSourceArray裡面,這個時候由於view監聽了dataSourceArray這個屬性,view就會直接調用tableView進行重新整理。這樣就是這個架構的互動流程。

    

    將view和view的重新整理放到view層,網路請求進行獨立,viewcontroller處理所有的東西,viewModel處理運算邏輯等和對頁面的元素進行表示和控制,這是整個架構基本的對類職責進行規定。


    為什麼不在請求成功後讓viewcontroller直接調用view的方法進行更新呢,你也可以這麼做,由於我對架構的理解不夠深刻,所以只能這麼回答。650) this.width=650;" src="http://img.baidu.com/hi/jx2/j_0077.gif" alt="j_0077.gif" />

    

  如果閑tableView礙事就可以這麼處理:

  • 將 UITableView 的 Data Source 分離到另外一個類中。

別人總結的方法,還沒進行實踐,只是感覺這麼分下去有點更亂了。等有時間實踐下。


    我們的項目中有個viewcontroller是從1500行減少到800行,雖然較少的不是太多,但是感覺邏輯更清晰了,新增的東西會有一個明確的地方處理,感覺更規範了。


    最後感覺架構的使用還是分項目和分頁面的,比較簡單的介面不用什麼架構,複雜的可以嘗試劃分。對架構的理解比較膚淺,可能有很多理解不對的地方,以後會改正吧。


參考資料:

被誤解的 MVC 和被神化的 MVVM


猿題庫 iOS 用戶端架構設計


淺談iOS中MVVM的架構設計與團隊協作    

iOS架構MVC+MVVM結合的實戰

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.