構(gòu)建iOS穩(wěn)定應用架構(gòu)時方案選擇的思考,主要涉及工程結(jié)構(gòu)肄满,數(shù)據(jù)流思想和代碼規(guī)范

工程結(jié)構(gòu)架構(gòu)谴古,減少耦合混亂以及防治需求大改造成結(jié)構(gòu)重構(gòu),如何構(gòu)建穩(wěn)定可擴展可變換的工程結(jié)構(gòu)的思考

我打算采用Information flow的方式自上而下稠歉,兩大層分為基礎層和展現(xiàn)層的結(jié)構(gòu)掰担。基礎層分為多層怒炸,展現(xiàn)層也可分為多層带饱。主要思想是將基礎層的最下一層當做零部件,將業(yè)務層最下層當做組裝大部件阅羹,通過流程串起來形成一個完整的產(chǎn)品勺疼,做零件時按照做出一個就扔進對應基礎層的籃子里思路來,目錄結(jié)構(gòu)也可以按照這種來進行捏鱼。這兩大層的最下層按照零件拆得越小越容易應對需求變化越容易保護鞏固上層的思路來就好执庐。拿微信這個大家都熟悉的產(chǎn)品的幾個功能來簡單示例說明下這個思路構(gòu)建后的結(jié)構(gòu),模塊比較多导梆,一些模塊就不深入到最底層分析了:

基礎層

- 網(wǎng)絡

-- 收發(fā)數(shù)據(jù)

---單例(持續(xù)使用數(shù)據(jù))

---本地(緩存和持續(xù)化存儲數(shù)據(jù)對業(yè)務的封裝輸出)

---單次使用(API接口Model封裝輸出和業(yè)務邏輯封裝的ViewModel轨淌,將這些做為業(yè)務零件)

- 存儲

--- NSUserDefault(對輕量需要存儲的添加下一層業(yè)務零件封裝)

--- keychain(對安全級別較高需要存儲的添加下一層業(yè)務零件封裝)

--- 文件存儲(對時效需求短的需要存儲的添加下一層業(yè)務零件封裝)

--- 數(shù)據(jù)庫存儲(對數(shù)據(jù)量大的需要存儲的添加下一層業(yè)務零件封裝,業(yè)務層上一層加一層封裝CoreData或SQLite方便日后切換數(shù)據(jù)庫用)

- 動畫(下層將動畫框架輸出成各個可以復用的動畫功能小零件)

- 視圖風格

- 列表控件

-- 上拉加載更多

-- 下拉刷新

-- GuideView

- WebView控件

- AlertView

- iOS系統(tǒng)空間封裝

-- 拍照控件

-- 通訊錄

- 二維碼

- 語音

- 安全

- 支付

- 統(tǒng)計

- 日志

展現(xiàn)層

- 首頁

-- 訂閱

-- 掃描二維碼

-- 發(fā)布視頻

- 列表

-- 時間軸列表

--- Listview頭部封面

--- 外鏈情況Cell

--- 圖片Cell

--- 廣告插入Cell

--- 留言評論

--- 贊區(qū)域

-- 我的列表

-- 訂閱列表

-- 文章列表

- 詳細頁

-- 分享

-- 內(nèi)容區(qū)

-- 評論

- 登錄

-- 注冊

-- 登錄

-- 忘記密碼

-- 條款

-- 上傳頭像

-- 個人信息修改

基礎層中各個模塊上層可以使用類似CocoaPod或Cathage方式看尼,下一層再對其引用進行業(yè)務封裝递鹉。

這里注意最下層需要拆的粒度越細越好。減少橫向依賴藏斩。類似Common這樣的東西可以拆到基礎層的對應模塊里梳虽,比如說配置文件里和統(tǒng)計相關(guān)的放到基礎層的統(tǒng)計里,網(wǎng)絡相關(guān)的放到網(wǎng)絡里灾茁,顏色字體放到視圖風格里窜觉,不要都堆在一個文件里谷炸。再或者是各種第三方的Category也放到對應的組里,比如說UIView+Additions和UIColor+Expanded就放到視圖風格這個模塊中禀挫,不要專門搞個Category放所有的Category旬陡。

數(shù)據(jù)流控制模式MVC和MVCS/MVVM/VIPER的選擇

其實這些都是對MVC的擴展,只是擴展的方向不同而已语婴。VIPER把視圖和數(shù)據(jù)拆得過細變相增加了復雜度很多人也都不熟也沒有意愿去了解它的實現(xiàn)描孟,但是模塊復用卻達到了最優(yōu),MVCS是這幾個里對MVC優(yōu)化最簡單的只是把數(shù)據(jù)的存儲拆開了砰左。MVVM正好介于VIPER和MVCS之間匿醒,從ViewController里拆出來的ViewModel能夠?qū)?shù)據(jù)經(jīng)過邏輯處理用于View的顯示,View有操作用過ReactiveCocoa將信號傳給ViewModel來處理缠导。

如果是我個人選擇我會選擇VIPER廉羔,因為它更符合細粒度模塊劃分的思想。但是用在團隊多人開發(fā)上僻造,還是偏向MVVM這種折中方案憋他。MVVM按照先前對應用的結(jié)構(gòu)分層,會將View和ViewController放到展現(xiàn)層的最下面的兩層里髓削,將ViewModel和Model放到基礎層對應模塊的最下面一層中竹挡。最后要說的是無論選擇哪種,只要是按照減少ViewController大小立膛,將改胖的地方放到Model或View都是可以的揪罕,招式學多后最高境界就是無招勝有招嘛,有時也不需要刻板的在一個項目中將所有的模塊都按照統(tǒng)一的思路給框死宝泵,比如說一個模塊很簡單就用MVC好啰,一般復雜就用MVVM,要是項目本身業(yè)務非常龐大可以整體采用VIPER來進行ViewController的完全拆分鲁猩。

可以通過下列圖表看其中的不同:

名稱 邏輯和視圖 數(shù)據(jù)

MVC View + ViewController + Model

MVCS View + ViewController + Store + Model

MVVM View + ViewController + ViewModel + Model

VIPER View + ViewController + Wireframe + Presenter + Interactor + Data Manager + Entity(Model)

代碼規(guī)范

這塊最有權(quán)威的應該是蘋果自己提出的蘋果官方規(guī)范,按照這套來肯定是沒問題的罢坝,而且首先應該遵守廓握。代碼結(jié)構(gòu)主要根據(jù)不同團隊的經(jīng)驗來做。下面舉個我常用的代碼結(jié)構(gòu)

@property

...

#pragma mark - Life cycle

生命周期嘁酿,類似addSubview和Notification的監(jiān)聽和銷毀都放在這里

#pragma mark - Interface

接口

#pragma mark - Event response

#pragma mark - Private method

如果是ViewController隙券,這個地方就是瘦身的關(guān)鍵,業(yè)務和邏輯功能相關(guān)的就放到ViewModel里闹司。

#pragma mark - Delegate

代理

#pragma mark - Getters and Setters

建議所有的Property都設置娱仔,這樣修改配置會比較方便,看起來不會很混亂

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末游桩,一起剝皮案震驚了整個濱河市牲迫,隨后出現(xiàn)的幾起案子耐朴,更是在濱河造成了極大的恐慌,老刑警劉巖盹憎,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筛峭,死亡現(xiàn)場離奇詭異,居然都是意外死亡陪每,警方通過查閱死者的電腦和手機影晓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩禾,“玉大人挂签,你說我怎么就攤上這事∨尾” “怎么了饵婆?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辆飘。 經(jīng)常有香客問我啦辐,道長,這世上最難降的妖魔是什么蜈项? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任芹关,我火速辦了婚禮,結(jié)果婚禮上紧卒,老公的妹妹穿的比我還像新娘侥衬。我一直安慰自己,他們只是感情好跑芳,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布轴总。 她就那樣靜靜地躺著,像睡著了一般博个。 火紅的嫁衣襯著肌膚如雪怀樟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天盆佣,我揣著相機與錄音往堡,去河邊找鬼。 笑死共耍,一個胖子當著我的面吹牛虑灰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痹兜,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼穆咐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起对湃,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤崖叫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熟尉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归露,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年斤儿,在試婚紗的時候發(fā)現(xiàn)自己被綠了剧包。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡往果,死狀恐怖疆液,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陕贮,我是刑警寧澤堕油,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站肮之,受9級特大地震影響掉缺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戈擒,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一眶明、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筐高,春花似錦搜囱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稽屏,卻和暖如春扮宠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狐榔。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工坛增, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荒叼。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓轿偎,卻偏偏與公主長得像典鸡,于是被迫代替她去往敵國和親被廓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容