關於代碼風格的一些看法

1 UIViewController和UIView網絡

Controller顧名思義,主要是用來作控制的,View是用來作UI展現的.但在實際的開發中,每每會將Controller和View都做爲UI層來展現,這樣作會有什麼問題?異步

a)View將不光負責展現控件,還須要處理業務數據,業務邏輯.對於一個業務邏輯很強的View這樣作還能夠,好比用戶的頭像控件,就是和用戶我的資料有很強業務關係的,這種作法是合理的.但若是是一個普通的View,好比一個底部工具條,裏面有不少按鈕,顯然再用View處理業務邏輯和數據是不合理的,這樣的View是無法複用的,若是你說:我不復用View,那就呵呵了.工具

b)Controller裏面可能存在大量的UI控件,各類建立控件的代碼,各類代理,回調,數據讀取,網絡請求,業務數據適配,這樣的ViewController將會變得很是龐大.ViewController就是一個頁面,一個完整的頁面,要用ViewController就是想用些和生命週期有關的ViewController特有的東西,若是隻是經過ViewController加載一個view,那最好直接用view.一般來說ViewController是不可以複用的,若是你從StoryBoard中連了不少控件到ViewController中,而那個StoryBoard中要是還有不少約束,那隨着業務的發展,這份代碼離沒法維護的日子就不遠了.佈局

那Controller應該作什麼:動畫

1 初始化UI(極少了的UI細節,各類自定義UIView)spa

2 addObserver 設置delegate,可能還有addTag,addGesture(極少的)代理

3 同步取本地數據,異步取網絡數據.(UI展現的數據,即便是同步數據也不該該在Controller裏初始化),對於數據,這裏應該是封裝了的數據,也就是說,一個View對應一個Model,而不該該是零散的數據,拼湊的.server

4 在代理和observer的回調中更新UI,這裏的更新UI只要1句話,把數據全都經過View的public interface 丟給View,至於View想用什麼,想怎麼更新,都是它本身的事情(這裏的View包括自定義的TableViewCell,CollectionViewCell,自定義的View),固然對於部分更新UI仍是要在View中暴露幾個public property.生命週期

5 若是你使用自動佈局或者Masonry要手動碼一些addConstraints這樣相似的代碼,或者你使用frame,那你要在viewDidLayoutSubviews設置每一個view的frame開發

6 最核心的部分,負責頁面的跳轉,跳轉也就是一句話,[XXXViewController xxx:];這裏須要在ViewController裏面實現一個或者多個類方法,方便外部調用和傳遞參數,這裏參數仍是建議封裝成一個model,只傳一個參數,裏面具體是什麼本身去解析.這裏ViewController只關心跳哪裏,具體怎麼跳,不須要寫在本ViewController裏.

7 動態展現一些子view,alertView,messageBox, 這裏是把ViewController弄亂的最好的地方,由於動態添加的view多是動畫,因此儘可能把view中動畫有關的東西都封裝到view中,ViewController只經過1-2句代碼建立View並完成動畫,而View給ViewController傳遞消息和數據通通都經過代理的方式,最後ViewController只要在某個代理裏remove這個view就能夠了.

因此整個ViewController寫下來import的東西應該是相似這樣的

#import "XXXViewController.h"

#import "XXXModel.h"

.....

#import "XXXView.h"

....

#import "XXXViewCell.h"

....

至於從model中獲取的數據不是view要顯示的數據應該怎樣作數據的適配呢?這裏就要使用到ViewModel,爲避免文章過長,下一篇詳細說明如何在已有的big VC中增長VM來瘦身VC.

相關文章
相關標籤/搜索