浅谈 iOS 开发框架的重要性

不论是前端,后台,移动端,结合到现实生活中,处处都会涉及到框架的应用,一个初期就设计优良的架构,素容置疑在项目的可维护性,扩展性,健壮性肯定都有很大的提升。所以我们必须要在开发之前在架构上面多下功夫!

对于一个项目来说 架构 一直是个值得关注的大话题, 这里我将其划分为几个部分去思考,设计。

文件目录模块架构, Coding设计模式层面架构 , 网络层框架架构, 数据持久化架构, UIKit层面架构,暂时先以这几个重要的层面去考虑,和设计。我们来依次讨论这几个模块的理解和设计方案。

文件目录模块架构

对于一个项目来说,最直观的设计就是在文件目录结构上,一个好的文件目录结构划分能让我们自己在开发过程中更加快速编写代码,也能让新加入的同事更快速的融入到项目中来,你想一下如果文件目录划分清晰明了,和一个杂乱无章的目录结构,那个阅读起来舒服?其就像一本书的编写排版,读完排序之后读者基本读整本书内容有一个清晰的认识,以及在后面阅读起来随时能通过排序来找到相应的章节.

所以在开发前期我们都应该根据我们当前项目所有涉及到的业务场景,需要使用到的模块心里都要有一个准备,参考了一些开源项目,以及网上关于项目目录划分的文章, 主流的划分逻辑大概是分为两种.

  1. 按项目内每个大的模块功能来进行文件夹划分.

  2. 按主要的设计模式来进行划分,例如: ViewController. View.Model VS ViewModel等.

个人更倾向于第一种, 举个栗子. 以********支付宝********为例,项目 TabBar 分为 5 个大模块, 一个是首页,财富,口碑,朋友,我的. 然后在依次建立 5 个相应的文件夹,当然还会有一些涉及功能很多的模块,比如项目里面的商城,生活号,小程序等,虽然可能都包含在这 5 个大的模块里面, 我们可以根据实际场景结合业务, 如果某个模块业务涉及场景和业务比较复杂, 都可以单独为其建立一个独立的文件夹, 与其他 5 个模块进行平级别的划分。

除了对模块进行划分外,我们在对项目里面肯定都会包含的网络层,数据持久层,工具类库层,三方资源层等等...这些在项目中使用率高的核心层面,也单独划分成一个文件夹的形式,方便以后新增代码的时候,将其按功能点来添加和划分。

这样我们开发过程中查找相应类文件,新增的时候也不会浪费太多的时间,也方便其他人阅读。

设计模式层面架构

这里主要是涉及到 设计模式的选择上, 目前比较主流的有 MVC.MVVM.MVP。然后我参考了知名应用 小猿搜题库 出的设计模式架构篇, 其主要是围绕 MVC 和 MVVM 将其优缺点进行一个优良改造版. 在两种架构中权衡而产生的架构MVVM without Binding with DataController, 我觉得很值得大家去参考,学习.

关于在设计模式上, 我觉得还是应该结合自己实际业务场景去进行选择最好, 不需要太死板要求为了遵守这种设计模式而遵守。每一种设计都有其优缺点, 我们应该权衡其利与弊抱着学习的态度来对待, 只要其能真正解决我们的痛点就是一个好的设计模式, 在选择上面我比较倾向于项目中多种设计模式公用的做法。 具体根据当前业务场景来。

网络框架架构

为什么要对网络层进行封装. 网络层的代码几乎遍布我们每一个页面, 想象一下假如我们不对网络层进行一个良好的封装, 每次调用原生库 NSURLSession 来请求一段网络大家会是什么心情? 在想象一个每次我们请求网络的时候基本都会添加一些公共参数,缓存处理,统一错误码等处理吧, 还有请求返回格式化设置等等. 这些都是基本很少变动的配置, 我们对其都做好封装,上层直接传入请求方法,URL,进来即可.

上面说的比较浅, 相信大家在项目中对网络层封装至少都 2 层以上, 本人主要是对 AFNetWorking 进行的一个封装, 第一层封装主要对 AFHttpSeesionManage 的初始化设置以及安全策略,证书校验,还有请求超时处理等. 第二层则是直接获取网络的类,对其做了一些添加公共参数,处理返回数据公共逻辑,返回结果错误码,添加缓存,缓存处理等。

这样做的好处有几点.

1. 假如有一天 AFNetWorking 不更新维护了, Apple 弃用了其最新版本的基于 NSURLSession 的网络请求类, 我们可能需要考虑更换一个新的底层网络库. 我们只需要更改第一层封装库的代码即可。 大大降低了对三方库的依赖关系

2. 通过第一层封装不仅完成了 降低依赖关系, 我们还做了公共的配置, 方便后续在做网络请求时, 不需要再重新配置, 实现只配置一次即可共全局使用的效果。 类似的第二层添加公共参数也是如此。

3. 第二层封装主要是我们在实际业务场景中,基本每个网络请求都会携带一些公共参数, 比如当前项目版本号,设备号,时间等,后台要求每次请求都要携带上这些公共参数, 我们将其封装起来。

4. 处理请求结果错误码,基本同理。

总结:不写重复的代码。

数据持久化架构

由于项目是主打 IM 即时通讯的, 会涉及到很多数据都需要保存到本地, 以及读取缓存的操作, 所以后期肯定要在数据缓存处理,数据读取,数据存储上做精心设计. 这一块目前自己能力有限, 主要我们先参考大神文章为主. 留个坑, 后续我们在来补上, 希望有数据结构设计,缓存处理方案的大神能指一二。

UIKit层面架构

UIKit 层面涉及到的范围也比较广, 我主要从视图控制器下手进行封装, 采用 BaseViewController 的方式, 对 ViewController 和 UINavigationController 以及 UITabBarController 等进行一个 基类控制器的封装, 将一些统一的参数,业务等进行配置, 方便后续在项目中类似的控制器中, 直接通过集成 BaseViewController 就可以轻松实现的功能.

结语

作者水平有限,文中可能有说的不对,或者错误的地方欢迎大家指正。

主要是通过参考网上比较出名的文章,结合自己项目实际场景来进行,后续我会把自己看到的相关资料统统放下面供大家参考! 非常感谢这些大神,前辈为我们提供如此精辟的技术分享,如同一盏黑暗里的明灯,不断指引我们走向光明大道!

参考资料:

iOS应用架构谈 view层的组织和调用方案

猿题库 iOS 客户端架构设计

被误解的 MVC 和被神化的 MVVM

浅谈 MVC、MVP 和 MVVM 架构模式

浅析 iOS 应用网络层设计

iOS应用架构谈 网络层设计方案

做一个 App 前需要考虑的几件事

onmyway133/fantastic-ios-architecture 设计模式架构思想汇总

老码农冒死揭开行业黑幕:如何编写无法维护的代码

不错开源项目

iOS 视图控制器转场详解

今日头条:iOS 架构设计杂谈

优秀的 iOS 应用架构:MVVM、MVC、VIPER,孰优孰劣

iOS应用架构现状分析

希望此篇文章对您有所帮助,如有不对的地方,希望大家能留言指出纠正。谢谢!!!!!

学习的路上,与君共勉!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和value...
    OoYoO阅读 162评论 0 0
  • 林染就这么呆呆地坐着,也不说话,低着头,偶尔装作不经意的抬头偷偷看几眼疯子,疯子也好像没有发觉,与旁边多年的闺蜜谈...
    沐初林染阅读 45评论 0 0
  • 昵称:飒飒秋风爽why 居住地点:张掖 交友宣言:交友这件事,相处时,若是脾气相投,自然亲近;淡了,距离变远,也无...
    飒飒秋风爽why阅读 240评论 2 3