您好,登錄后才能下訂單哦!
框架對整個應用程序的作用非常重要,記得有個朋友說過:用什么框架啊,好好封裝一下不就行了嗎?但我的理解是,好的封裝絕對可以事半功倍,但是如果不按照一定的規則進行封裝就會讓人有些難以理解了,維護代碼的人要瘋掉了,我認為架構就是規定怎么去封裝的。
在拜讀的大神們對框架的構思之后,我決定在我們的項目中進行實踐一下。剛到了一家新公司,公司的代碼極爛,沒有什么設計思想,最終導致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的方法進行更新呢,你也可以這么做,由于我對框架的理解不夠深刻,所以只能這么回答。
如果閑tableView礙事就可以這么處理:
將 UITableView 的 Data Source 分離到另外一個類中。
別人總結的方法,還沒進行實踐,只是感覺這么分下去有點更亂了。等有時間實踐下。
我們的項目中有個viewcontroller是從1500行減少到800行,雖然較少的不是太多,但是感覺邏輯更清晰了,新增的東西會有一個明確的地方處理,感覺更規范了。
最后感覺架構的使用還是分項目和分頁面的,比較簡單的界面不用什么架構,復雜的可以嘗試劃分。對框架的理解比較膚淺,可能有很多理解不對的地方,以后會改正吧。
參考資料:
被誤解的 MVC 和被神化的 MVVM
猿題庫 iOS 客戶端架構設計
淺談iOS中MVVM的架構設計與團隊協作
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。