iOS分層架構設計-介紹篇

一、前言

iOS的應用也需要架構設計嗎?答案是肯定的,但是并不一定采用分層架構設計。一般情況下,有關信息處理的應用采用分層架構設計,而游戲等應用不會采用分層架構設計。

Tips:游戲開發一般都會采用某個引擎,游戲引擎事實上包含里架構設計解決方案,游戲引擎的架構一般不是分層的而是樹形結構的。

  • 表示層:它由UIKit Framework構成,包括視圖、控制器、控件和事件處理等。
  • 業務邏輯層:框架的選取是根據業務而定,但一般是具有一定業務處理功能的編程語言封裝的類或函數。
  • 數據持有層:提供本地和網絡數據訪問,它可能是訪問SQLite數據的API函數,也可能是Core Data技術,或是訪問文件的NSFileManager,或是網絡通信技術。
  • 信息系統層:它的信息來源分為本地和網絡。本地數據可以放入文件中,也可以放入數據庫中,目前iOS本地數據庫采用SQLite3。網絡可以是某個云服務,也可以是一般的Web服務。
圖1:分層架構設計圖

二、工程與工作空間

Xcode不僅可以創建工程(Project),還可以創建工作空間(Workspace)。出于方便管理等目的,我們可以將多個相互管理的工程放到一個工作空間中,工作空間是多個工程的集合。工程文件名的后綴是.xcodeproj,工作空間文件名的后綴是.xcworkspace。

三、靜態鏈接庫

有時候,我們需要將某一層復用給其他團隊、公司或個人,但由于某些原因,我們不能提供源代碼,此時就可以將業務邏輯層和數據持有層編寫成靜態鏈接庫(static library 或 static-linked library)或框架(Framework)。
庫是一些沒有main函數的程序代碼的集合。除了靜態鏈接庫,還有動態鏈接庫。它們的區別是:靜態鏈接庫可以編譯到你的執行代碼中,應用程序可以在沒有靜態鏈接庫的環境下運行;動態鏈接庫不能編譯到你的執行代碼中,應用程序必須在有鏈接庫文件的環境下運行。
在Xcode中可以創建靜態鏈接庫工程,具體過程如下:
File -> New -> Project - > ...
Framework & Library -> Cocoa Touch Static Library工程模板。如下圖:

圖2:創建靜態鏈接庫工程

Tips:靜態鏈接庫中不能有Swift代碼模塊,只能是Objective-C代碼模塊。

四、框架

由于靜態鏈接庫比較麻煩,需要給開發者提供.a和.h文件,使用的時候還要配置很多的環境變量。事實上,蘋果提供的API(如UIKit、QuartzCoreFoundation)都是框架。為了方便使用,框架會將.a或.h等文件打包在一起。
在Xcode中可以創建框架,具體過程如下:
File -> New -> Project - > ...
Framework & Library -> Cocoa Touch Framework

Tips:自定義框架沒有靜態鏈接庫的限制,Swift代碼可以在框架工程中使用。

五、10種分層模式

由于iOS 8 之后可以使用Swift和Objective-C兩種語言,開發人員都有四種方式來選擇開發語言。

  • 采用純Swift的改革派方式
  • 采用純Objective-C的保守派方式
  • 采用Swift調用Objective-C的左傾改良派
  • 采用Objective-C調用Swift的右傾改良派

從技術上講,無論是否采用分層架構設計,都可以用上述4種方式來選擇語言。也就是說,可以在同一層中采用單一語言和搭配混合,也可以在不同層之間采用單一語言和搭配混合。基于圖1進行分層,如果只考慮業務邏輯層和數據持有層采用相同語言的情況下,那么可以混合搭配出4種模式,具體如下圖:

圖3:4種混合搭配

另外,如果考慮到代碼的組織形式,可以分為如下3種:

  • 同一工程的分層,用P(Project)表示
  • 基于靜態鏈接庫實現的同一個工作空間不同工程的分層,用WL(Workspace Library)表示
  • 基于自定義框架實現的同一個工作空間不同工程的分層,用WF(Workspace Framework)表示

組合后得出如下圖10種分層模式

圖4:10種分層模式

由于框架實現要先進于靜態鏈接庫實現,所以WFOOO、WFSSS、WFSOO和WFOSS是我們優先考慮的,如果從技術和設計上無法實現,可以考慮WLOOO和WLSOO,最后是POOO、PSSS、PSOO和POSS實現。

六、寫在最后

本期主要以介紹為主,下一期將更新實戰篇,會以具體的項目為主體,詳細解析如何使用分層架構。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,711評論 25 708
  • 靜態庫與動態庫的區別 首先來看什么是庫,庫(Library)說白了就是一段編譯好的二進制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 12,025評論 3 42
  • 搬了新房,心情大悅,因為陽臺可以看風景,放眼望去,十里之外的風景盡收眼底。 住了半輩子的小高層,并且一...
    冰楠一閱讀 552評論 2 3
  • 嗯 ,今天呢 是我和我初戀分手的第二年第四個月第十三天 我和她的故事 就像童話一樣. 而我今天要講的 就是我和她的...
    劉易可閱讀 382評論 0 3
  • AOP(Aspect-Oriented Programming) 面向切面編程 Aspect: 橫切面的功能,抽象...
    瀝人土土閱讀 703評論 0 0