前言
Viewcontroller
通常是項(xiàng)目中最大的文件, 并且包含很多不必要的代碼嘱么, 所以viewcontroller
的代碼幾乎總是服用率最低的糠悯。 現(xiàn)在要做的是給viewcontroller
瘦身甥雕, 讓代碼變得可以復(fù)用, 以及把代碼卸載合適的地方萤晴。
在這里我們只關(guān)注在MVC下讓viewcontroller
瘦身的方法吐句,MVVM另篇說(shuō)
將Data Source和其他Protocols分離出來(lái)
把UITableViewDataSource
的數(shù)據(jù)源方法提取出來(lái)放到一個(gè)單獨(dú)的類(lèi)中,是最好的瘦身方式之一店读, 可以創(chuàng)建出復(fù)用的類(lèi)嗦枢。通過(guò)block的回調(diào)來(lái)設(shè)置UITableViewDataSource
, 這樣會(huì)很方便.在使用block的時(shí)候可以使用typedef
的方式來(lái)取別名, 這樣統(tǒng)一起來(lái)也是為了更方便的使用block.
typedef void (^TableViewCellConfigureBlock)(id cell, id item);
很形象的一個(gè)命名方式是吧
此外, 這種方法也可以擴(kuò)展到其他的protocols
上面. 最明顯的一個(gè)就是UICollectionViewDataSource
, 這么做靈活性很大; 比如, 在開(kāi)發(fā)的某個(gè)時(shí)候, 想利用UICollectionView
替代UITableView
, 那么幾乎不用對(duì)ViewController
做任何修改, 甚至可以讓datasource
同時(shí)支持這兩個(gè)協(xié)議.
將業(yè)務(wù)邏輯移到Model中
對(duì)于在viewcontroller
中要調(diào)用某個(gè)具有特定功能的方法, 可以把實(shí)現(xiàn)這個(gè)特定功能的代碼寫(xiě)在自定義的類(lèi)的category
中, 提供一個(gè)對(duì)象方法來(lái)調(diào)用,這樣也會(huì)使viewcontroller
比較清晰. 有些代碼不能被輕松地移動(dòng)到model對(duì)象中, 但明顯和model代碼緊密聯(lián)系, 對(duì)于這種情況, 可以自定義一個(gè)類(lèi)了.
創(chuàng)建自定義的類(lèi)
可以在我們創(chuàng)建的自定義類(lèi)中來(lái)寫(xiě)這些代碼, 比如說(shuō)在自定義構(gòu)造方法中,這樣viewcontroller
就沒(méi)有必要知道這些. 通過(guò)分離, 就可以服用這些代碼, 單獨(dú)測(cè)試, 并且讓viewcontroller
保持清晰. 自定義的對(duì)象會(huì)關(guān)心數(shù)據(jù)加載, 緩存和設(shè)置數(shù)據(jù)棧, 這個(gè)對(duì)象通常會(huì)被稱(chēng)為服務(wù)層或者創(chuàng)庫(kù)
把網(wǎng)絡(luò)請(qǐng)求邏輯移到Model層
和上面的思想相似: 不要在viewcontroller
中做網(wǎng)絡(luò)請(qǐng)求的邏輯, 而是應(yīng)該將它們封裝到一個(gè)類(lèi)中, 這樣, viewcontroller
就可以在之后通過(guò)使用回調(diào)來(lái)請(qǐng)求網(wǎng)絡(luò)了. 這樣的好處是緩存和錯(cuò)誤控制也可以在這個(gè)類(lèi)里面.
將View代碼移到View層
不應(yīng)該在viewcontroller
中構(gòu)建復(fù)雜的view層次結(jié)構(gòu), 可以使用xib或者把views封裝到一個(gè)UIView
的子類(lèi)中(個(gè)人還是偏好用純代碼布局, 雖然比較慢, 但是好維護(hù)點(diǎn)吧).
通訊
其他在viewcontroller
中經(jīng)常發(fā)生的事是與其他viewcontroller, model, views
之間進(jìn)行通訊, 在這里也應(yīng)該盡量用少的代碼來(lái)完成它.
當(dāng)一個(gè)viewcontroller
想把某個(gè)狀態(tài)傳遞給多個(gè)其他viewcontrollers`時(shí), 就會(huì)出現(xiàn)消息傳遞不清晰的問(wèn)題. 較好的做法是把狀態(tài)放到一個(gè)單獨(dú)的對(duì)象中, 然后把這個(gè)對(duì)象傳遞給其他的
viewcontroller, 通過(guò)這個(gè)來(lái)觀察和修改狀態(tài). 這樣的好處是消息傳遞都在一個(gè)地方(被觀察的對(duì)象)進(jìn)行, 而且也不用糾結(jié)嵌套的delegate
回調(diào).
總結(jié)
這些方法都是為了實(shí)現(xiàn)一個(gè)目標(biāo): 寫(xiě)可維護(hù)的代碼. 知道這些方法后, 就有可能把那些臃腫的
viewcontrollers
變得整潔清晰.