iOS(也可以说移动平台)的应用也需要架构设计吗?答案是肯定的,但是并不一定采用分层架构设计。一般情况下,有关信息处理的应用应该采用分层架构设计,而游戏等应用不会这种采用分层架构设计。 提示 游戏开发一般都会采用某个引擎,游戏引擎事实上包含了架构设计解决方案,游戏引擎的架构一般不是分层的而是树形结构的。 图10-2所示是iOS分层架构设计,其中各层内容说明如下。 表示层。它由UIKit Framework构成,包括我们前面学习的视图、控制器、控件和事件处理等内容。 业务逻辑层。采用什么框架要根据具体的业务而定,但一般是具有一定业务处理功能的Swift、Objective-C和C++等语言封装的类,或者是C封装的函数。 数据持久层。提供本地或网络数据访问,它可能是访问SQLite数据的API函数,也可能是Core Data技术,或是访问文件的NSFileManager,或是网络通信技术。采用什么方式要看信息系统层是什么。 信息系统层。它的信息来源分为本地和网络。本地数据可以放入文件中,也可以放在数据库中,目前iOS本地数据库采用SQLite3。网络可以是某个云服务,也可以是一般的Web服务。 图10-2 iOS平台中信息处理应用的分层架构设计图 在iOS平台中,分层架构设计有多种模式,在介绍这些模式之前我们要熟悉一些重要的概念:工程与工作空间、静态链接库和框架。 10.2.1 工程与工作空间 使用Xcode不仅可以创建工程(Project),还可以创建工作空间(Workspace),本书此前介绍的案例全部是基于工程的。出于方便管理等目的,我们也可以将多个相互管理的工程放到一个工作空间中,工作空间是多个工程的集合。工程文件名的后缀为.xcodeproj,工作空间文件名的后缀是.xcworkspace。 图10-3所示是具有3个工程的工作空间,它们之间可以互相建立依赖关系。要创建工作空间,可以通过菜单File→New→Workspace来实现。需要说明的是,此时创建的工作空间是空的,没有工程,我们可以为其添加工程,具体操作将在后面详细介绍。 图10-3 Xcode工作空间 10.2.2 静态链接库 有时候,我们需要将某一层复用给其他的团队、公司或者个人,但由于某些原因,我们不能提供源代码,此时就可以将业务逻辑层和数据持久层编写成静态链接库(static library或statically-linked library)或框架(Framework)。 库是一些没有main函数的程序代码的集合。除了静态链接库,还有动态链接库,它们的区别是:静态链接库可以编译到你的执行代码中,应用程序可以在没有静态链接库的环境下运行;动态链接库不能编译到你的执行代码中,应用程序必须在有链接库文件的环境下运行。 在Xcode中可以创建静态链接库工程,具体创建过程如下:在Xcode中选择菜单File→New→ Project…,在打开的对话框中选择Framework & Library→Cocoa Touch Static Library工程模板,如图10-4所示。 图10-4 创建静态链接库工程 提示 静态链接库中不能有Swift代码模块,只能是Objective-C代码模块。 10.2.3 框架 由于静态链接库比较麻烦,需要给使用者提供.a和.h文件,使用的时候还要配置很多的环境变量。事实上,苹果提供的API(如UIKit、QuartzCore和CoreFoundation)都是框架。为了方便使用,框架会将.a和.h等文件打包在一起。 在Xcode 6之前,苹果没有提供开发框架的工程模板。直到Xcode 6,开发人员才可以创建自己的框架。图10-5所示的Cocoa Touch Framework工程模板可以帮助开发者创建自己的框架。 图10-5 创建框架 提示 自定义框架没有静态链接库的限制,Swift代码可以在框架工程中使用。 10.2.4 10种分层模式 由于iOS 8之后应用开发可以使用Swift和Objective-C两种语言,开发人员都有4种方式来选择开发语言: 采用纯Swift的改革派方式; 采用纯Objective-C的保守派方式; 采用Swift调用Objective-C的左倾改良派方式; 采用Objective-C调用Swift的右倾改良派方式。 从技术上讲,无论是否采用分层架构设计,都可以用上述4种方式来选择语言。也就是说,可以在同一层中采用单一语言和混合搭配,也可以在不同层之间采用单一语言和混合搭配。但是从设计规范上讲,一般不会在同一层中使用混合搭配,在不同层之间可以混合搭配。基于图10-2进行分层,如果只考虑业务逻辑层和数据持久层采用相同语言的情况下,那么可以混合搭配出4种模式,具体如下。 ObjC-ObjC-ObjC,缩写为OOO:用Objective-C语言实现表示层,用Objective-C语言实现业务逻辑层,用Objective-C语言实现数据持久层。 Swift-Swift-Swift,缩写为SSS:用Swift语言实现表示层,用Swift语言实现业务逻辑层,用Swift语言实现数据持久层。 Swift-ObjC-ObjC,缩写为SOO:用Swift语言实现表示层,用Objective-C语言实现业务逻辑层,用Objective-C语言实现数据持久层。 ObjC-Swift-Swift,缩写为OSS:用Objective-C语言实现表示层,用Swift语言实现业务逻辑层,用Swift语言实现数据持久层。 另外,如果考虑到代码的组织形式,可以分为如下3种组织方式: 同一工程的分层,用P(Project)表示; 基于静态链接库实现的同一个工作空间不同工程的分层,用WL(Workspace Library)表示; 基于自定义框架实现的同一个工作空间不同工程的分层,用WF(Workspace framework)表示。 因此,经过组合,可以得到表10-1所述的结果。 表10-1 10种分层模式 混合搭配 代码组织 OOO SSS SOO OSS P POOO PSSS PSOO POSS WL WLOOO 无 WLSOO 无 WF WFOOO WFSSS WFSOO WFOSS 根据表10-1得出10种分层模式。由于框架实现要先进于静态链接库实现,所以WFOOO、WFSSS、WFSOO和WFOSS是我们优先考虑的,如果从技术和设计上无法实现,可以考虑WLOOO和WLSOO,最后是POOO、PSSS、PSOO和POSS实现。