溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

UIViewController解耦---淺析Three20架構(gòu)

發(fā)布時(shí)間:2020-06-25 06:53:44 來(lái)源:網(wǎng)絡(luò) 閱讀:373 作者:zxcv0418 欄目:移動(dòng)開發(fā)

前言

Three20是一款由Facebook開源的框架,由大神Joe Hewitt創(chuàng)建,曾經(jīng)風(fēng)靡一時(shí),被無(wú)數(shù)開發(fā)者觀閱。Three20主要提供了UI模塊、Network模塊以及相關(guān)的一些工具。Three20自開源之初就褒貶不一,有人稱贊它強(qiáng)大的UI工具,也有人在詬病Three20各個(gè)模塊之間的耦合度太高,而且更多人在抱怨Three20極少的開發(fā)文檔,我想這些大概也是Three20在蘋果發(fā)布iOS6之后就停止了更新維護(hù)的原因吧。大神Joe Hewitt創(chuàng)建的在Github上的源碼早已刪除,目前只有少數(shù)人在GitHub上為自己的項(xiàng)目維護(hù)。而我也是有幸在某個(gè)項(xiàng)目中見(jiàn)識(shí)到了曾經(jīng)耳聞,卻未目睹的Three20框架,因此才有了這篇文章。

架構(gòu)

最近大家都在討論MVC、MVVM以及MVP三種在移動(dòng)端開發(fā)中常用到的架構(gòu)模式,究竟是哪種架構(gòu)最強(qiáng)大,最適合移動(dòng)開發(fā)者使用。這里筆者也闡述一下個(gè)人意見(jiàn),有句方言叫“樹挪死,人挪活”,個(gè)人認(rèn)為,架構(gòu)是死的,開發(fā)者是活的,我們不需要局限于哪一種架構(gòu)的模式之下,看到大家都在用MVVM,于是花大成本將MVC架構(gòu)模式的老項(xiàng)目重構(gòu)成了MVVM架構(gòu),這種重構(gòu)個(gè)人看來(lái)其實(shí)并沒(méi)有意義。更多的架構(gòu)話題就不想在這里討論了,筆者推薦幾篇大神們關(guān)于架構(gòu)的見(jiàn)解。

  • 被誤解的 MVC 和被神化的 MVVM

    這是一篇被早已被翻爛了的文章,起碼我個(gè)人反復(fù)閱讀了數(shù)次,由家喻戶曉的唐巧大神編寫。

  • iOS 架構(gòu)模式–解密 MVC,MVP,MVVM以及VIPER架構(gòu)

    最近在Cocoa China上發(fā)表的一篇譯文,筆者之前看過(guò)倆次原文,講的比較形象。

  • MVC,MVP 和 MVVM 的圖示

    大神阮一峰的博文,以圖形展示的方式使得各層結(jié)構(gòu)更加清晰明了。

  • 猿題庫(kù) iOS 客戶端架構(gòu)設(shè)計(jì)

    猿題庫(kù) iOS客戶端開發(fā)者藍(lán)晨鈺的博文,以實(shí)際項(xiàng)目猿題庫(kù)詳解了架構(gòu)設(shè)計(jì)

UIViewController瘦身

架構(gòu)模式并不是限制思維,相反應(yīng)該是發(fā)散思維,我們并不應(yīng)該為了架構(gòu)而架構(gòu),架構(gòu)應(yīng)該是服務(wù)于我們的代碼邏輯,打造更具有擴(kuò)展性和健壯的代碼結(jié)構(gòu)。就比如,大多數(shù)開發(fā)者都會(huì)遇到一個(gè)同樣的問(wèn)題,隨著項(xiàng)目一天天的壯大,功能越來(lái)越多,需求越來(lái)越多,而我們的UIViewController也變得越來(lái)越臃腫。在上面推薦的博文中,筆者們都或多或少的闡述了如何打造更輕量級(jí)的UIViewController,大都列舉了一些共性策略:

  • 將一個(gè)界面中的數(shù)據(jù)獲取抽象成一個(gè)類,這里面細(xì)分一下,包括了網(wǎng)絡(luò)請(qǐng)求和數(shù)據(jù)庫(kù)緩存,我們可以針對(duì)這倆點(diǎn)再次封裝成倆個(gè)類。

  • 將一個(gè)界面中的數(shù)據(jù)處理邏輯抽象成一個(gè)類,這里面包含了各種數(shù)據(jù)轉(zhuǎn)換和算法邏輯,比如數(shù)據(jù)檢索,數(shù)據(jù)遍歷等。

  • 將一個(gè)界面中數(shù)據(jù)傳遞到UIView視圖的過(guò)程抽象成一個(gè)模型類,這里面就包含了對(duì)應(yīng)到UIView視圖的每一個(gè)數(shù)據(jù)的傳遞,比如icon圖標(biāo),title標(biāo)題,comment評(píng)論內(nèi)容等。

  • 將一個(gè)界面中所有展示的UIView視圖的添加和渲染抽象成一個(gè)類,這里包含了添加控件,自定義動(dòng)畫等。這個(gè)對(duì)視圖的封裝仍然可以細(xì)分,每一個(gè)自定義控件都可以單獨(dú)封裝,因?yàn)檫@樣可以完美的在其他的UIViewController達(dá)到復(fù)用的目的。

而完成了上述抽象之后,就會(huì)發(fā)現(xiàn)我們需要在UIViewController中完成的工作僅僅是處理視圖交互邏輯和數(shù)據(jù)傳遞邏輯,這樣我們的UIViewController就比較容易維護(hù)了。

Three20架構(gòu)

每一種框架的興起和衰落都有其相應(yīng)的時(shí)勢(shì)和必然性。雖然Three20飽受詬病,早已跌落神壇,但是它的存在是有一定道理的。雖然它在模塊之間的耦合度較高,但是個(gè)人認(rèn)為它對(duì)UIViewController的抽象和封裝也是一個(gè)非常好的借鑒。在這里以Three20中對(duì)TTTableViewController的解耦為例,先上圖看一下TTTableViewController包含的模塊:

UIViewController解耦---淺析Three20架構(gòu)

這里根據(jù)上面的結(jié)構(gòu)圖具體地解釋一下解耦的設(shè)計(jì)方式。TTTableViewController的設(shè)計(jì)遵從了經(jīng)典的MVC模式,TTModel負(fù)責(zé)數(shù)據(jù)的獲取和處理邏輯,TTTableView負(fù)責(zé)視圖展示,TTTableViewController負(fù)責(zé)TTModelTTTableView之間的通信邏輯和界面的控件添加渲染。而TTTableViewController在順應(yīng)了MVC模式的前提下,也做了一些擴(kuò)展,它將TTTableViewDatasource接收數(shù)據(jù)傳遞的邏輯抽象出來(lái)封裝成了TTTableItem。而TTTableItem就是關(guān)聯(lián)TTModel傳遞數(shù)據(jù)的過(guò)程,因而我們也可以把這一層稱作是MVVM架構(gòu)模式中的ViewModel

根據(jù)上面的圖示,我們可以看到獲取數(shù)據(jù)的邏輯都在TTModel中,而且界面控件添加和動(dòng)畫渲染這些邏輯仍然都在TTTableViewController中,因此我根據(jù)大神們的一些建議,對(duì)項(xiàng)目中的Three20進(jìn)行了一下強(qiáng)化,先上圖看一下增加的結(jié)構(gòu):

UIViewController解耦---淺析Three20架構(gòu)

可以清晰地看到,我將TTModel中處理緩存數(shù)據(jù)的邏輯抽象出來(lái),單獨(dú)放在了TTCacheModel中,此外還將TTTableViewController中添加控件和渲染動(dòng)畫的邏輯抽象出來(lái),放到了TTViewRender中,這樣TTTableViewController就只關(guān)心界面交互以及TTModelTTTableItem之間的數(shù)據(jù)傳遞邏輯。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI