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阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别...
    吃瓜群众呀阅读 11,619评论 3 42
  • 搬了新房,心情大悦,因为阳台可以看风景,放眼望去,十里之外的风景尽收眼底。 住了半辈子的小高层,并且一...
    冰楠一阅读 507评论 2 3
  • 嗯 ,今天呢 是我和我初恋分手的第二年第四个月第十三天 我和她的故事 就像童话一样. 而我今天要讲的 就是我和她的...
    刘易可阅读 373评论 0 3
  • AOP(Aspect-Oriented Programming) 面向切面编程 Aspect: 横切面的功能,抽象...
    沥人土土阅读 678评论 0 0