UIViewController解耦---淺析Three20架構

前言

Three20是一款由Facebook開源的框架,由大神Joe Hewitt)建立,曾經風靡一時,被無數開發者觀閱。Three20主要提供了UI模塊、Network模塊以及相關的一些工具。Three20自開源之初就褒貶不一,有人稱讚它強大的UI工具,也有人在詬病Three20各個模塊之間的耦合度過高,並且更多人在抱怨Three20極少的開發文檔,我想這些大概也是Three20在蘋果發佈iOS6以後就中止了更新維護的緣由吧。大神Joe Hewitt)建立的在Github上的源碼早已刪除,目前只有少數人在GitHub上爲本身的項目維護。而我也是有幸在某個項目中見識到了曾經耳聞,卻未目擊的Three20框架,所以纔有了這篇文章。html

架構

最近你們都在討論MVC、MVVM以及MVP三種在移動端開發中經常使用到的架構模式,到底是哪一種架構最強大,最適合移動開發者使用。這裏筆者也闡述一下我的意見,有句方言叫「樹挪死,人挪活」,我的認爲,架構是死的,開發者是活的,咱們不須要侷限於哪種架構的模式之下,看到你們都在用MVVM,因而花大成本將MVC架構模式的老項目重構成了MVVM架構,這種重構我的看來其實並無意義。更多的架構話題就不想在這裏討論了,筆者推薦幾篇大神們關於架構的看法。ios

UIViewController瘦身

架構模式並非限制思惟,相反應該是發散思惟,咱們並不該該爲了架構而架構,架構應該是服務於咱們的代碼邏輯,打造更具備擴展性和健壯的代碼結構。就好比,大多數開發者都會遇到一個一樣的問題,隨着項目一每天的壯大,功能愈來愈多,需求愈來愈多,而咱們的UIViewController也變得愈來愈臃腫。在上面推薦的博文中,筆者們都或多或少的闡述瞭如何打造更輕量級的UIViewController,大都列舉了一些共性策略:架構

  • 將一個界面中的數據獲取抽象成一個類,這裏面細分一下,包括了網絡請求和數據庫緩存,咱們能夠針對這倆點再次封裝成倆個類。mvc

  • 將一個界面中的數據處理邏輯抽象成一個類,這裏麪包含了各類數據轉換和算法邏輯,好比數據檢索,數據遍歷等。框架

  • 將一個界面中數據傳遞到UIView視圖的過程抽象成一個模型類,這裏面就包含了對應到UIView視圖的每個數據的傳遞,好比icon圖標,title標題,comment評論內容等。mvvm

  • 將一個界面中全部展現的UIView視圖的添加和渲染抽象成一個類,這裏包含了添加控件,自定義動畫等。這個對視圖的封裝仍然能夠細分,每個自定義控件均可以單獨封裝,由於這樣能夠完美的在其餘的UIViewController達到複用的目的。

而完成了上述抽象以後,就會發現咱們須要在UIViewController中完成的工做僅僅是處理視圖交互邏輯和數據傳遞邏輯,這樣咱們的UIViewController就比較容易維護了。

Three20架構

每一種框架的興起和衰落都有其相應的時勢和必然性。雖然Three20飽受詬病,早已跌落神壇,可是它的存在是有必定道理的。雖然它在模塊之間的耦合度較高,可是我的認爲它對UIViewController的抽象和封裝也是一個很是好的借鑑。在這裏以Three20中對TTTableViewController的解耦爲例,先上圖看一下TTTableViewController包含的模塊:

Three20中TTTableViewController解耦

這裏根據上面的結構圖具體地解釋一下解耦的設計方式。TTTableViewController的設計聽從了經典的MVC模式,TTModel負責數據的獲取和處理邏輯,TTTableView負責視圖展現,TTTableViewController負責TTModelTTTableView之間的通訊邏輯和界面的控件添加渲染。而TTTableViewController在順應了MVC模式的前提下,也作了一些擴展,它將TTTableViewDatasource接收數據傳遞的邏輯抽象出來封裝成了TTTableItem。而TTTableItem就是關聯TTModel傳遞數據的過程,於是咱們也能夠把這一層稱做是MVVM架構模式中的ViewModel

根據上面的圖示,咱們能夠看到獲取數據的邏輯都在TTModel中,並且界面控件添加和動畫渲染這些邏輯仍然都在TTTableViewController中,所以我根據大神們的一些建議,對項目中的Three20進行了一下強化,先上圖看一下增長的結構:

Three20結構強化

能夠清晰地看到,我將TTModel中處理緩存數據的邏輯抽象出來,單獨放在了TTCacheModel中,此外還將TTTableViewController中添加控件和渲染動畫的邏輯抽象出來,放到了TTViewRender中,這樣TTTableViewController就只關心界面交互以及TTModelTTTableItem之間的數據傳遞邏輯。

相關文章
相關標籤/搜索