ReactiveCocoa组件的内存逻辑分析

为了更好了解ReactiveCocoa,以便在开发过程中更准确的使用,曾花蛮多时间阅读ReactiveCocoa的实现源码。漫无目的地阅读源码是难以坚持的,因此总习惯找一条脉络,分析ReactiveCocoa的内存管理逻辑显然是一条不错的路线。

ReactiveCocoa的三大基础组件(signal、subscriber、disposable)中,signal的逻辑是最复杂的;而众多signal中,RACDynamicSignal的实现逻辑最为晦涩难懂,它的使用频率也最高,因此本文选择对围绕RACDynamicSignal的信号处理逻辑进行内存分析,过程中自然也会将subscriber、disposable的逻辑也给弄清楚;站在另外一个角度来看,倘若能将RACDynamicSignal的内存逻辑分析清除,分析RACSubject等自然也不在话下。

当ReactiveCocoa遇上多线程

在使用RAC过程中,无法避免和各种block打交道,譬如RACDynamicSignal被订阅时触发的block(didSubscribe block),处理signal值事件的next block等等。初学者常会纠结这些block的执行时机,本文是我学习过程中对RAC线程问题的梳理。

RACSignal的简单使用与基本操作

写在前面

2016年07月初入职场,因为工作需要,接触了ReactiveCocoa(也常称为RAC)。彼时,正如前辈所告知的那样:ReactiveCocoa的学习曲线较陡峭。或许是我网络搜索能力欠佳,那时很难在网上找到比较靠谱的RAC中文资料。然而比较幸运的是,我司大神臧成威恰好那时在内部开辟了系列RAC视频教学,让我的RAC学习经历没那么痛苦。另外,值得一提的是,美团几篇公开的ReactiveCocoa技术博客仍然是RAC初学者不得不看的优质资料。

这一两年来,时至今日(2017年尾),网络上优质的RAC博客慢慢多起来了,基于这些优质的博客,RAC的「学习陡峭」问题其实已经有明显好转。

我在学习RAC过程中,记录了不少的学习笔记,趁闲整理一下,大概包括如下几个部分:

  • 信号(RACSignal)的简单使用和基本操作
  • ReactiveCocoa的内存管理
  • ReactiveCocoa与多线程

我个人认为,搞清楚了如上这三个方面的内容,基本上就可以上手使用ReactiveCocoa进行开发了。当然,RACCommand也是要了解的,后者的内部实现比较复杂,但使用起来还是蛮方便的,可能也会在后面博客中涉及它。至于其他相关概念,譬如RACSchedulerRACSubject,实现相对简单,遇到问题看源码基本就可以解决。

显式动画

隐式动画是在iOS平台创建动态用户界面的一种直接方式,也是UIKit动画机制的基础,不过它并不能涵盖所有的动画类型。本文旨在要研究显式动画,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。

隐式动画

根据我粗浅的理解,「隐式动画」中的所谓「隐式」,是相对于「显式动画」中的显式而言的。

实现显式动画时,往往会创建一个动画对象,譬如CAAnimationCABasicAnimationCAKeyframeAnimation,然后通过CALayer#addAnimation(_:forKey:)方法该动画对象绑定到layer中,简单来说,我们所选的动画类型是确定的。