輕量級TableViewController(MVC深究)

原文出處: TouAllCra(@我是鎮明是我)   html

       從前瞭解到MVC,學習到這個架構,覺得已經能夠了,直到這段時間看到這些優秀的文章,才發現本身是如此看小它,是多麼誤解它,甚至這麼不瞭解它,因此記錄這篇文章以總結對此的理解~程序員

我記得有很多大神這麼說的,「若是你單頁的代碼行數超過150行,那麼就是須要滾動頁面查看代碼了,這個時候你的代碼就須要優化了,若是單頁代碼行數超過250行,那麼你的代碼須要滾動屢次才能查看完代碼,這個時候你的代碼就須要重寫了,優秀整潔的代碼標準是100行之內,甚至最好是50行之內,那樣的話,你的代碼就很不錯了」,固然,這段總結性語句不是必定是對的,只是見仁見智,不過這裏面就能很好說明,咱們的代碼,咱們的項目應該具備可維護性,低耦合,高複用性,如今提出的各類架構,相似MVP,MVVM,VIPER,就是出於對這些性能追求而提出的。編程

即便從前作過針對MVC學習的項目,我也認爲學習它,應該從相似UITableViewController,或者UICollectionViewController等這些類來學習更好。就用UITableViewController來舉例深刻了解MVC數組

一開始寫過這個類的人都明白,這個類每次寫出來的代碼行都是上百,甚至有時候上幾百的,致使它成爲項目中最大的文件。還包含不很多的沒必要要的代碼,是它不須要履行的責任都包含在裏面,因此這樣的Controllers的代碼救護是複用率最低,可維護性差,一個項目下來,會發現整個項目變得很脆,很容易糊一碰一修改就會bug或者改頭換尾的。因此,許許多多大神對此投入研究提出很多架構,爲此作瘦身,提升性能和代碼質量。網絡

蘋果官方這有這麼一段關於ViewController和MVC的說明:架構

 

 

 

 

 

 

大概就是代表了ViewController是應該定義爲去協調model和view的一箇中間類,當view發生了改變,應該由這個類告訴model,而model處理的數據,也應該由這個類反饋給view,,從而實現view上的改變,這個也是蘋果提出的,也是MVC發揚的由來。(官方MVC文檔介紹(1)官方MVC介紹文檔(2))app

關係圖以下:ide

 

 

 

 

 

 

說到這裏應該瞭解到什麼是MVC了,也就是Model-ViewController-View。(這裏還有一個關於MVC等架構圖示的總結)性能

可是怎麼實現?從這裏開始,我就以爲應該從UITableViewController開始入手了,它會是咱們學習和實現MVC的一個很好的例子,同時如今大多數的應用都或多或少,甚至整個App都是這個類組成的。(關於UITableViewController這是一個學習這個類的一篇很好的文章)。學習

爲何我提出UITableVIewController是一個學習MVC的一個很好實例?是由於它原本就是一個MVC,很好的MVC例子,甚至從它身上學習MVC你會以爲有一種煥然大悟的感受。

在UItableVeiwController中有那麼一個協議老是會用到的——Data Source

 

 

 

這上面是一個例子,同時是咱們使用UITableViewController常用的方法,一看,他們在咱們的TableViewController中多佔地方,並且上面也提到,Controller應該只負責協調model和view之間的溝通,而不是負責數據處理,所以若是咱們把它放出來到一個單獨的類裏面,你會以爲如何?

那就是,整個UITableVeiwController瞬間少了很多行數~這個類就明顯瘦了一圈,同時這個Model還能提取出來用到不一樣的類中,例如其餘的UItableVeiwController和UICollectionController中,這樣就是複用,這樣就能夠減小對類似類的建立,進而提高整個項目代碼的質量。

至於這裏面怎麼實現建立cell,在這篇文章也有說起一點,那就是取決於我的習慣,能夠用delegate,屬性,也可使用block,而我我的比較建議學着使用一些block,但不要濫用block。

從這個例子中,能夠總結出,儘量,或者說必定要把業務邏輯,數據處理,以及網絡請求等全部關於數據的都移到Model,這就要涉及,到底數據是什麼,我想說,在這裏,數據不只僅是說後臺那一堆符號,或者一些邏輯運算,甚至在view上面要顯示的name,secure,count等都是咱們所說要概括到Model中的數據。若是你想基本分離,實現Model和controller低耦合的話,我建議你能夠用一個store類做爲一個數據倉庫,同時store負責提供API給Controller進行獲值和回調,下圖就是我提供給你的一個圖示:

 

 

 

這是關於Model和ViewController的一個圖示同時我也建議這麼作,這樣作的好處是Data的改變不會給整個項目帶來不少的麻煩,同時這樣子就是一種低耦合,高複用性的表現

而在UITableViewController裏,TableViewCell就是咱們在這個模型中的view,可能有人看到這裏會想,對啊,是哦,這是個view啊,即便那些無心識本身建立cell這個類,也不必定有意識到這個自己就是一個view。

在咱們建立ViewController的時候,自己就不建議在其中構建負載的view,反而建議使用Interface Bulider或者代碼封裝到一個UIView子類中。這樣子,你能夠作到一個更加輕量級的ViewController,

我再次以一個圖示總結一下上面我說起的:

 

 

 

這個就是所謂MVC的完整圖示。

可能很多人在建立Data Source和Cell這兩個類的時候,會以傳入indexPath這個參數來進行對Cell的建立,就像這樣:

 

 

 

(虛線僅表示其之間是間接傳值的)

但是我告訴你,最好不要這樣,當咱們有多個TableViewController和UICollectionController的時候,你會所以建立不少個類似的類的,咱們應該讓它擁有可複用性,這也適用在Cell上,讓Cell能夠作到一對多,同時,儘量減小項目類似文件和類似代碼的產生是一個好的程序員必備的責任,也是好的項目,高質量的代碼必須有的。

在這裏,咱們能夠觀察一下這個Data Source,就會發現,其實他們都是圍繞一個數組組成的,因此,其實咱們能夠以數組做爲API外供,這樣子Data Source就不會如上圖那樣,過於依賴indexPath這個參數,至於Cell的複用,我建議看看這篇文章,最好先本身想一下在看。

這裏面的一個觀點,我必須強調一下,也是我認爲好的思想,那就是View的狀態應該在其內部控制,而不要在別的地方實現,就像你本身不該該依靠其餘人那樣。

問啊APP,程序員答題神器,解決你全部的技術難題, (上問啊APP 瞭解更多) http://t.cn/R4vE2d7 下載註冊送5元 快去下載註冊吧!


問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com 下載問啊APP,參與官方懸賞,賺百元現金。

QQ羣290551701 彙集不少互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

相關文章
相關標籤/搜索