一、前言
iOS的應用也需要架構設計嗎?答案是肯定的,但是并不一定采用分層架構設計。一般情況下,有關信息處理的應用采用分層架構設計,而游戲等應用不會采用分層架構設計。
Tips:游戲開發一般都會采用某個引擎,游戲引擎事實上包含里架構設計解決方案,游戲引擎的架構一般不是分層的而是樹形結構的。
- 表示層:它由UIKit Framework構成,包括視圖、控制器、控件和事件處理等。
- 業務邏輯層:框架的選取是根據業務而定,但一般是具有一定業務處理功能的編程語言封裝的類或函數。
- 數據持有層:提供本地和網絡數據訪問,它可能是訪問SQLite數據的API函數,也可能是Core Data技術,或是訪問文件的NSFileManager,或是網絡通信技術。
- 信息系統層:它的信息來源分為本地和網絡。本地數據可以放入文件中,也可以放入數據庫中,目前iOS本地數據庫采用SQLite3。網絡可以是某個云服務,也可以是一般的Web服務。
二、工程與工作空間
Xcode不僅可以創建工程(Project),還可以創建工作空間(Workspace)。出于方便管理等目的,我們可以將多個相互管理的工程放到一個工作空間中,工作空間是多個工程的集合。工程文件名的后綴是.xcodeproj,工作空間文件名的后綴是.xcworkspace。
三、靜態鏈接庫
有時候,我們需要將某一層復用給其他團隊、公司或個人,但由于某些原因,我們不能提供源代碼,此時就可以將業務邏輯層和數據持有層編寫成靜態鏈接庫(static library 或 static-linked library)或框架(Framework)。
庫是一些沒有main函數的程序代碼的集合。除了靜態鏈接庫,還有動態鏈接庫。它們的區別是:靜態鏈接庫可以編譯到你的執行代碼中,應用程序可以在沒有靜態鏈接庫的環境下運行;動態鏈接庫不能編譯到你的執行代碼中,應用程序必須在有鏈接庫文件的環境下運行。
在Xcode中可以創建靜態鏈接庫工程,具體過程如下:
File -> New -> Project - > ...
Framework & Library -> Cocoa Touch Static Library工程模板。如下圖:
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種:
- 同一工程的分層,用P(Project)表示
- 基于靜態鏈接庫實現的同一個工作空間不同工程的分層,用WL(Workspace Library)表示
- 基于自定義框架實現的同一個工作空間不同工程的分層,用WF(Workspace Framework)表示
組合后得出如下圖10種分層模式
由于框架實現要先進于靜態鏈接庫實現,所以WFOOO、WFSSS、WFSOO和WFOSS是我們優先考慮的,如果從技術和設計上無法實現,可以考慮WLOOO和WLSOO,最后是POOO、PSSS、PSOO和POSS實現。
六、寫在最后
本期主要以介紹為主,下一期將更新實戰篇,會以具體的項目為主體,詳細解析如何使用分層架構。