iOS项目架构概述

基于业务需求的架构,不要为了架构而架构

MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写
苹果官方文档 推荐使用的一个设计模式,经典中的经典。
看懂斯坦福公开课上的这张图就够了
Image text

控制器可以直接访问模型数据,控制器通过懒加载数据,再把数据给view展示。
M只负责提供数据,不关心数据展示在哪里;
V展示什么数据,只有C知道,V是通过C的数据源来获得数据;
为了保持M和V的重用性,M和V都不能直接拥有C;
M和V不能相互访问,M不知道V的存在,V不知道M的存在,他们2个只能通过C建立联系。

特点:简单明了够清晰。加上写分类,抽取工具类,按需抽取业务manager
MVC是一个非常成熟的架构,在业务开始复杂的时候,合理的将网络请求,数据持久化等相关与控制器耦合不严重的公共抽取出来,足够满足日常开发需求。
例如:网络请求数据,可以先对AFN框架进行通用基础封装,再进行业务层封装,使用block回调数据。

MVVM

从广义上讲,MVVM也属于MVC的编程思想范畴,它是把业务逻辑抽取成一个VM模块,减轻C的压力,弱化C,以便于重用和测试,且兼容MVC
Image text
Image text

MVVM With RAC

ReactiveCocoa简称RAC,是由Github开源的一个应用于iOS和OS开发的新框架。
RAC吸纳了函数式编程(Funtional Programming)和响应式编程(Reactive Programing)的编程思想,它也被描述为函数响应式编程(FRP)框架。
RAC最大的优点是 提供了一个单一的、统一的方法去处理异步的行为,包括 Delegate,Blocks Callbacks,Target-Action机制,Notifications和KVO。
它最大的与众不同是提供了一种新的写代码的思维,由于RAC将Cocoa中KVO、UIKit Event、Delegate、Selector等都增加了RAC支持,所以都不用去做很多跨函数的事,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要考虑调用顺序,直接考虑结果,把每一次操作都写成一系列嵌套的方法中,使代码高聚合,方便管理。。
参考学习:
最快让你上手ReactiveCocoa之基础篇
最快让你上手ReactiveCocoa之进阶篇
美团点评技术团队的博文

MVVM With RxSwift

RxSwift是整个ReactiveX里针对Swift语言的库,ReactiveX里面还有针对Java,JS,.Net, Swift,Android,PHP等使用的库,它们内部都用了ReactiveX的逻辑思想。

ReactiveX是Reactive Extensions的缩写,一般简写为Rx。
Rx(函数库) = Observables(异步数据流) + LINQ(操作符查询异步数据流) + Schedulers(参数化异步数据流的并发处理)。
Rx是一种编程模型,最初由微软开发,结合了观察者模式、迭代器模式和函数式编程的精华,来更方便地处理异步数据流。其中最重要的一个概念是 Observable。
Rx提供了观察者模式来处理事件序列,还提供了很多强大的操作符,操作符让你可以变换、组合、操纵和处理Observable发射的数据;让你可以用声明式的风格组合异步操作序列,它拥有回调的所有效率优势,同时又避免了典型的异步系统中嵌套回调的缺点。

RxSwift 也被描述为函数响应式编程(Functional Reactive Programming, FRP)框架。
Image text
推荐参考学习:
RxSwift
why use rx?
Marbles
使用 RxSwift 进行响应式编程
是时候学习 RxSwift 了
坠入链式编程的幻乐里–用RxSwift仿写知乎日报
RxSwift/Documentation/的中文翻译
ReactiveX文档中文翻译

可以尝试Moya+RxSwift+HandyJSON这几个框架一起使用。其实RAC和RxSwift都能实现函数式响应式编程,满足你的开发编码需求。如果是使用OC的项目可以使用RAC,Swift项目可以使用RxSwift。个人还是比较喜欢RxSwift,因为其文档写得更清晰优秀,且相对来说比较轻量级,语法更新比较少,RAC后期也是吸纳了一些Rx的思想。

VIPER

含义:视图 (View),交互器 (Interactor),展示器 (Presenter),实体 (Entity) 以及路由 (Routing)
Image text
其实可以简单的理解为MVC里抽取多了两部分:
把MC之间交互的部分抽取成一个DataTool,用于处理网络请求、数据解析
把MV之间的逻辑部分抽取成Presenter,用于准备所有View需要的最终数据,展示到view上面
Image text

组件化方案

参阅:iOS项目组件化开发

其它

单向数据流动的函数式 View Controller
RxSwift
ReSwift
ReSwift介绍

打赏支持一下呗!