学习笔记 - iOS 应用架构谈_view层的组织和调用方案

非常感谢 Casa 老师的文章,让我长久以来的很多疑惑,很多看了又忘的知识得到了系统的整理和总结。文章很容易让我建立起自己的记忆模型。就我的感觉,作为iOS程序员,把这样的文章读上几十遍都不为过,有种醍醐灌顶的痛彻。其中还有一个很重要的点,作为架构师是为工程师服务的,这种想法尤其的纯粹,放到工程师身上,如果也想着自己的代码是给别人读的,自己的产品是给用户用的,相信世界将变得更美好,我们离梦想也会更近。

View代码结构的规定  --  life cycle --> delegate --> event response --> getter & setter  ❤❤❤

关于view的布局  --  masonry  ❤❤❤

何时使用storyboard,nib,coding

统一派生ViewController?  --  AOP ❤❤❤

方便View布局的小工具

MVC、MVVM、MVCS、VIPER  ❤❤❤

跨业务时View的处理  --  Mediator  ❤❤❤


1. Coding Guidelines


2. VC结构  

(1) 图

(2) ViewDidLoad --> addSubView

(2.5) viewWillLayoutSubview or didLayoutSubview --> 布局

(3) ViewDidAppear --> Notification,通知一类

(4) 属性初始化 --> getter & setter(or [self ~~])

life cycle --> delegate --> event response --> getter & setter


3. View布局

Masonry (UIView + LayoutMethod + AEBHandyAutoLayout)


4. Storyboard + nib + coding

(1) 改动

(2) link现 的 + -


5. 统一派生VC

(1) 使用成本

          <1> 集成成本

         <2> 上手成本

         <3> 架构维护

(2) 不使用派生也可以          

          AOP --> Method Swizzling(Aspects)   <1> VC拦截  <2> NSObject的+load

Method Swizzling只支持针对现有方法的操作

拓展方法 --> Category(化继承为组合)不推荐过度使用


6. MVC 

<1> MVC(Model - View - Controller):

其中Model是数据管理者,View是数据展示者,Controller是数据加工者。Model和View又都是由Controller来根据业务需求调配,所以Controller还负担了一个数据流调配的功能。

在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步。这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映模型的变化;当用户和控制器交互的时候,模型也应该做出相应的改变。

<2> 服务器端 & Native(图)

UIViewController --> UIView(容器)(再看objccn的VC教程豁然开朗)

<3> 在iOS开发领域中,MVC划分

M:

给 VC 提供数据

给 VC 存储数据提供接口

提供经过抽象的业务基础组件,供 C 调度

C:

管理 VC 的生命周期

负责生成所有的 View 实例,并放入 VC

监听来自 View 与业务有关的事件,通过与 Model 的合作,来完成对应事件的业务

V:

响应与业务无关的事件,并因此引发动画效果,点击反馈(如果合适的话,尽量还是放在View去做)

界面元素表达

<4> MVCS

拆分的部分是 Model,拆出来一个 Store,专门负责数据存取。实际是拆分C。


7. 胖 Model && 瘦 Model

(1)胖 M包含了部分弱业务逻辑。目的:C从胖M这里拿到数据之后,不用额外做操作或者只要做非常少的操作,就能够将数据直接应用在View上。

强业务变动的可能性要比弱业务大得多,弱业务相对稳定。弱业务重复出现的频率要大于强业务。

缺点:相对比较难移植,拔出萝卜带出泥。违背MVC思想,Model是一个Layer,不应该做Object做的事情。软件成长,越来越胖,难维护。

(2)瘦 M只负责业务数据的表达,所有业务无论强弱一律给C。目的:尽一切可能去编写细粒度Model,然后配置各种helper类或方法来对弱业务做抽象,强业务 --> C。

缺点:一定程度违背了DRY的思路。C会膨胀。


MVCS是基于瘦Model的一种架构思路,把原本Model要做的很多事情中的其中一部分关于数据存储的代码抽象成了 Store,在一定程度上降低了 C 的压力。


8. MVVM

数据加工的任务从 C 中解放了出来,使得 C 只需要专注于数据调配的工作,ViewModel则去负责数据加工并通过通知机制让 View 响应 ViewModel的改变。ViewModel就是把RawData变成直接能被View使用的对象的一种Model。

MVVM是基于胖Model的架构思路建立的,然后在胖Model中拆分两部分:Model && ViewModel。


reformer == ViewModel  --  API -> View方向

ReactiveCocoaRACSignal  --  View -> API & Con方向


8.5 ReactiveCocoa

不用RAC也能MVVM,用RAC能更好地体现MVVM的精髓。前面的例子是 数据从API到View的方向,View的操作也会产生数据,数据更多体现在表达用户的操作上,比如输入内容,就是text,选择cell,就是indexPath。那么数据从View走向API 或者 C。就是RAC发挥的地方。

View <--> ViewModel <--> Model

View <--> C <--> ViewModel <--> Model  =  MVCVM

C夹在V 和 VM之间,是将V 和 VM进行绑定。逻辑上,C 知道要展示哪个View,也知道应该使用哪个VM,但是V和VM互相不知道对方。所以要绑定。

在MVC的基础上,把C拆出一个ViewModel专门负责数据处理的事情,就是MVVM。还有一种说法是本身有胖Model,用于处理弱业务逻辑的事情,是对胖Model中数据加工的功能进行了分离。

在iOS领域里KVO,Notification,block,delegate 和 target-action 都可以用来做数据通信,实现绑定。但都不如RAC提供的RACSignal来的优雅,不用RAC,绑定关系可能做不到那么松散。


9. VIPER (View - Interactor - Presenter - Entity - Routing)


10. 拆分:

第一心法:保留最重要的任务,拆分其他不重要的任务。

第二心法:拆分后的模块要尽可能提高可复用性,尽量做到DRY  --  IOP

第三心法:要尽可能提高拆分模块后的抽象度


发送文本和图片逻辑  --  对枚举的应用

即使拆分粒度因为客观原因无法细化,那也能把复杂的判断逻辑和调度逻辑从 C 中抽出来,真正的为 C 做到了减负。总之能够做到大粒度就尽量大粒度,实在做不到那也行,用Strategy把它hold住。

Strategy模式  --  拆分粒度无法细化,用于处理复杂的判断逻辑和调度逻辑。


10.5 设计:

一:尽可能减少继承层级,涉及苹果原生对象的尽量不要继承

二:做好代码规范,规定好代码在文件中的布局,尤其是VC中

三:能不放在C做的事情就尽量不要放在C里面去做


跨业务页面调用方案的设计

依赖关系下沉 -- Mediator模式


11. objc并没有像java那么严格的私有概念。但在实际工作中,我们并不太会去操作头文件里面没有的变量,这是在规范上就被禁止的。

高度的封装性。getter事实上是工厂方法,有了getter之后,业务逻辑可以更加专注于调用,而不必担心当前变量是否可用。


12. View层架构:

(1)制定良好的规范

(2)选择好合适的模式(MVC、MVCS、MVVM、VIPSER)

(3)根据业务情况针对 VC 做好拆分,提供一些小工具方便开发


13. AOP:

面向切面(切片)的编程,任务一般分为1 2 3 4步,针对每个步骤间隙的编程。

AOP一般都是需要有一个拦截器,然后在每一个切片运行之前和之后(任何你希望的地方),通过调用拦截器的方法来把这个 jointpoint 扔到外面,在外面获得这个 jointpoint 的时候,执行相应的代码。

iOS中,用 Method Swizzling。第二种是使用 protocol。对比MS额外好处是,可以通过拦截器来给实现者提供更多的信息,便于外部实现更加了解当前切片的情况。另外,可以更精细地对切片进行划分。MS的切片粒度是函数粒度的,自己实现的拦截器的切片粒度可以比函数更小,更加精细。

缺点就是,你得自己在每个插入点把调用拦截器方法的代码写上。通过Aspects(MS)来实现的AOP,就轻松一些。

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

推荐阅读更多精彩内容