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
被誤解的 MVC 和被神化的 MVVM:這是一篇被早已被翻爛了的文章,起碼我我的反覆閱讀了數次,由家喻戶曉的唐巧大神編寫。算法
iOS 架構模式--解密 MVC,MVP,MVVM以及VIPER架構:最近在Cocoa China上發表的一篇譯文,筆者以前看過倆次原文,講的比較形象。數據庫
MVC,MVP 和 MVVM 的圖示:大神阮一峯的博文,以圖形展現的方式使得各層結構更加清晰明瞭。緩存
猿題庫 iOS 客戶端架構設計:猿題庫 iOS客戶端
開發者藍晨鈺的博文,以實際項目猿題庫
詳解了架構設計網絡
架構模式並非限制思惟,相反應該是發散思惟,咱們並不該該爲了架構而架構,架構應該是服務於咱們的代碼邏輯,打造更具備擴展性和健壯的代碼結構。就好比,大多數開發者都會遇到一個一樣的問題,隨着項目一每天的壯大,功能愈來愈多,需求愈來愈多,而咱們的UIViewController也變得愈來愈臃腫。在上面推薦的博文中,筆者們都或多或少的闡述瞭如何打造更輕量級的UIViewController,大都列舉了一些共性策略:架構
將一個界面中的數據獲取抽象成一個類,這裏面細分一下,包括了網絡請求和數據庫緩存,咱們能夠針對這倆點再次封裝成倆個類。mvc
將一個界面中的數據處理邏輯抽象成一個類,這裏麪包含了各類數據轉換和算法邏輯,好比數據檢索,數據遍歷等。框架
將一個界面中數據傳遞到UIView視圖的過程抽象成一個模型類,這裏面就包含了對應到UIView視圖的每個數據的傳遞,好比icon圖標,title標題,comment評論內容等。mvvm
將一個界面中全部展現的UIView視圖的添加和渲染抽象成一個類,這裏包含了添加控件,自定義動畫等。這個對視圖的封裝仍然能夠細分,每個自定義控件均可以單獨封裝,由於這樣能夠完美的在其餘的UIViewController達到複用的目的。
而完成了上述抽象以後,就會發現咱們須要在UIViewController中完成的工做僅僅是處理視圖交互邏輯和數據傳遞邏輯,這樣咱們的UIViewController就比較容易維護了。
每一種框架的興起和衰落都有其相應的時勢和必然性。雖然Three20飽受詬病,早已跌落神壇,可是它的存在是有必定道理的。雖然它在模塊之間的耦合度較高,可是我的認爲它對UIViewController的抽象和封裝也是一個很是好的借鑑。在這裏以Three20中對TTTableViewController
的解耦爲例,先上圖看一下TTTableViewController
包含的模塊:
這裏根據上面的結構圖具體地解釋一下解耦的設計方式。TTTableViewController
的設計聽從了經典的MVC
模式,TTModel
負責數據的獲取和處理邏輯,TTTableView
負責視圖展現,TTTableViewController
負責TTModel
與TTTableView
之間的通訊邏輯和界面的控件添加渲染。而TTTableViewController
在順應了MVC
模式的前提下,也作了一些擴展,它將TTTableViewDatasource
接收數據傳遞的邏輯抽象出來封裝成了TTTableItem
。而TTTableItem
就是關聯TTModel
傳遞數據的過程,於是咱們也能夠把這一層稱做是MVVM
架構模式中的ViewModel
根據上面的圖示,咱們能夠看到獲取數據的邏輯都在TTModel
中,並且界面控件添加和動畫渲染這些邏輯仍然都在TTTableViewController
中,所以我根據大神們的一些建議,對項目中的Three20進行了一下強化,先上圖看一下增長的結構:
能夠清晰地看到,我將TTModel
中處理緩存數據的邏輯抽象出來,單獨放在了TTCacheModel
中,此外還將TTTableViewController
中添加控件和渲染動畫的邏輯抽象出來,放到了TTViewRender
中,這樣TTTableViewController
就只關心界面交互以及TTModel
和TTTableItem
之間的數據傳遞邏輯。