本文用于記錄一些零碎的設(shè)計(jì)思路。不定時(shí)更新中......
1.庫(kù)的傳參
封裝庫(kù)即封裝第三方,當(dāng)需要讓外界定制時(shí)(類似頁(yè)面的跳轉(zhuǎn)傳參惜姐,只是項(xiàng)目中頁(yè)面的跳轉(zhuǎn)一般參數(shù)不多)牧抵,主要有以下幾種方式:
① 參數(shù)直接傳入
參數(shù)直接傳入適用于大部分場(chǎng)景,不過(guò)參數(shù)多了也顯得繁瑣运嗜,所以可能會(huì)通過(guò)分成多個(gè)Config模型類傳入晕城。參數(shù)傳參的時(shí)機(jī)也是即時(shí)的催植。
參數(shù)可能通過(guò)屬性叠纷,也可能通過(guò)函數(shù)參數(shù)刻帚,在Swift中,函數(shù)參數(shù)提供的擴(kuò)展性很強(qiáng)涩嚣,你可以通過(guò)枚舉數(shù)組[options]
達(dá)到自定義的效果崇众。
② 通過(guò)協(xié)議數(shù)據(jù)源傳入
參數(shù)傳入是即時(shí)的,通過(guò)數(shù)據(jù)源是在必要的時(shí)候從外界獲取航厚。這個(gè)的好處是可以再適當(dāng)?shù)臅r(shí)機(jī)去處理需要的數(shù)據(jù)傳入顷歌。同時(shí)作為一個(gè)封裝庫(kù),也是需要通過(guò)代理回調(diào)給外界幔睬,這邊不贊同使用閉包(代碼塊)眯漩。
協(xié)議可以作為數(shù)據(jù)源和代理的橋梁,在適當(dāng)時(shí)機(jī)獲取需要的參數(shù)溪窒,在多個(gè)時(shí)機(jī)獲取對(duì)應(yīng)回調(diào)坤塞。
③ 通過(guò)模型類傳入
模型類傳入,有點(diǎn)參數(shù)傳入的意思澈蚌,這邊的模型類不僅僅是我們常見(jiàn)的Model,也比如Moya中的Target灼狰、CTNetworking中的BaseManager宛瞄,將特異性的參數(shù)封在內(nèi)部。
2.協(xié)議的使用
在OC中交胚,協(xié)議似乎和代理綁在一起份汗,其實(shí)不然。無(wú)論在OC還是Swift中蝴簇,協(xié)議的用處都是很大的:
① 代理回調(diào)和數(shù)據(jù)源
UITableView是最典型的例子杯活,TableView在適當(dāng)時(shí)機(jī)從ViewController獲取需要的參數(shù),在多個(gè)時(shí)機(jī)回調(diào)給ViewController熬词,讓它去做事情旁钧。
(比如在我們不想把數(shù)據(jù)帶過(guò)去處理或者數(shù)據(jù)帶來(lái)帶去,就可以在原本界面處理給下一個(gè)界面互拾。)
② 約束類
這邊有兩種場(chǎng)景:
- 一個(gè)是約束函數(shù)的參數(shù)歪今,只能傳入符合該協(xié)議的對(duì)象,比如在設(shè)置代理的時(shí)候颜矿。
- 一個(gè)是約束類的方法寄猩,在AFNetWorking中,
AFURLRequestSerialization
是一個(gè)協(xié)議骑疆,規(guī)范類的主要功能田篇。無(wú)論是AFHTTPRequestSerializer還是它的子類AFJSONRequestSerializer替废,都會(huì)去實(shí)現(xiàn)這個(gè)功能。
@interface AFHTTPRequestSerializer : NSObject <AFURLRequestSerialization>
@interface AFJSONRequestSerializer : AFHTTPRequestSerializer
在Swift中泊柬,這種規(guī)范就更加常見(jiàn)了舶担,比如Moya的Target協(xié)議規(guī)范了作為一個(gè)Request模型類該實(shí)現(xiàn)的功能。
另外彬呻,多層回調(diào)傳遞(比如cell中的view代理要傳遞方法至cell所在的vc)可以通過(guò)兩層Delegate(ViewDelegate衣陶,CellDelegate(繼承于ViewDelegate))。
3.區(qū)分類的職責(zé)
封裝一個(gè)庫(kù)闸氮,除了考慮怎么傳參和回調(diào)剪况,更重要的是庫(kù)的設(shè)計(jì)。庫(kù)的設(shè)計(jì)簡(jiǎn)單說(shuō)就是分成幾個(gè)類蒲跨?每個(gè)類擔(dān)任什么職責(zé)译断?每個(gè)類的關(guān)系是怎么樣?
在CTNetworking的設(shè)計(jì)中或悲,簡(jiǎn)單的請(qǐng)求集合著不同的扮演者孙咪,有的負(fù)責(zé)提供數(shù)據(jù)(數(shù)據(jù)源),有的負(fù)責(zé)校驗(yàn)(檢驗(yàn)者)巡语,有的負(fù)責(zé)回調(diào)(回調(diào)者)翎蹈,有的負(fù)責(zé)處理數(shù)據(jù)(適配器)。
4.ViewController繼承的使用
ViewController的繼承要分離好子類和父類各自的職責(zé)男公。
比如ImagePickerPreviewViewController(大圖瀏覽界面)的父類用于封裝ImagePreviewView的手勢(shì)操作和動(dòng)畫(huà)荤堪。ImagePickerPreviewViewController自身用于添加外表的ToolBar,處理數(shù)據(jù)枢赔,處理代理方法澄阳。
當(dāng)然使用繼承有3大要點(diǎn):
1.父類只是給子類提供服務(wù),并不涉及子類的業(yè)務(wù)邏輯踏拜。
2.層級(jí)關(guān)系明顯碎赢,功能劃分清晰,父類和子類各做各的速梗。
3.父類的所有變化肮塞,都需要在子類中體現(xiàn),也就是說(shuō)此時(shí)耦合已經(jīng)成為需求镀琉。
其他情況下優(yōu)先考慮組合峦嗤。
5.配置類的設(shè)計(jì)
配置類(比如Config)大多數(shù)也是當(dāng)作參數(shù)注入我們的項(xiàng)目模塊,實(shí)現(xiàn)自定義設(shè)置的屋摔。
在UICollectionView中烁设,Layout類本身也是類似配置類(通過(guò)協(xié)議限定我們實(shí)現(xiàn)的方法),負(fù)責(zé)提供布局所需要的信息。簡(jiǎn)單理解就是装黑,我需要這些配置信息副瀑,你實(shí)現(xiàn)給我。
一個(gè)好的龐大的配置類恋谭,需要將配置做分割糠睡,將對(duì)應(yīng)小模塊的配置分配到各自的小配置中。比如網(wǎng)易云信的NIMKitConfig這個(gè)類就設(shè)計(jì)得不錯(cuò)疚颊,多而不雜狈孔。
6.相似界面的設(shè)計(jì)
相似界面的設(shè)計(jì)主要有兩種思路,一種是繼承材义,一種是配置均抽。當(dāng)然混合起來(lái)也是可以的。
繼承主要應(yīng)用于兩個(gè)界面的控件有遞進(jìn)的關(guān)系其掂∮突樱基類搭建基礎(chǔ)控件,子類添加個(gè)性化的控件款熬。
配置主要用于兩個(gè)界面比較相似深寥,界面控件、控件布局或界面參數(shù)通過(guò)配置類的方法來(lái)決定贤牛。
7.聊天界面的設(shè)計(jì)
聊天界面要想實(shí)現(xiàn)自定義惋鹅,解耦,首先有UI層面和數(shù)據(jù)層面的區(qū)分盔夜。UI層面當(dāng)然在ViewController去實(shí)現(xiàn)负饲,自定義的內(nèi)容可以通過(guò)配置類來(lái)提供,不同的配置類決定這個(gè)界面的一些不同之處喂链。比如聊天界面的背景圖,icon妥泉,或者聊天菜單選項(xiàng)椭微,轉(zhuǎn)發(fā)菜單選項(xiàng),當(dāng)然還有最重要的數(shù)據(jù)提供者(主要負(fù)責(zé)提供下拉請(qǐng)求聊天數(shù)據(jù))盲链。不同的數(shù)據(jù)提供者提供的數(shù)據(jù)也是不一樣的蝇率,很明顯的數(shù)據(jù)和UI做了解耦。