RAC 5.0 相比于 4.0 有了巨大的变化,不仅是受 swift 3.0 大升级的影响,RAC 对自身项目结构的也进行了大幅度的调整。这个调整就是将 RAC 拆分为四个库:ReactiveCocoa、ReactiveSwift、ReactiveObjC、ReactiveObjCBridge。

ReactiveCocoa

现在的 RAC 注意力主要集中在 Swift 和 UI 层上,将原来一个基于 RAC 面向 UI 层的扩展库 Rex 合并进了 RAC 。

RAC 3 和 4 的主要精力在围绕 Swift 重新打造一个响应式编程库。因为这部分的核心 API 已经很成熟,所以现在将重心放在为 AppKit 和 UIKit 提供一些更好用的扩展上。

ReactiveSwift

原来 RAC 中只和 Swift 平台相关的核心代码被单独抽取成了一个新框架:ReactiveSwift 。

Swift 正在快速成长并且成长为一个跨平台的语言。把只和 Swift 相关的代码抽取出来后,ReactiveSwift 就可以在其他平台上被使用,而不只是局限在 CocoaTouch 和 Cocoa 中。

ReactiveObjC

在 RAC 3 和 4 中,RAC 也包含了 RAC 2 中的 OC 代码。现在这部分代码被移到了 ReactiveObjC 。

这样做的原因是因为两个库虽然有着一样的核心编程范式,实际上却是完全独立的两套 API 。实际的使用中,RAC 4 和 RAC 2 是完全不同的两组用户群,并且维护的团队其实也是两组。之前混在一个库里也增加了管理的复杂度。拆分出去后也可以更加自由的维护 ReactiveObjC 。

ReactiveObjCBridge

在把 Swift 和 OC 的库拆分之后问题来了,并不是所有的库都是纯 OC 和 Swift 的。有相当大一部分项目处于 OC 迁移到 Swift 过程中,其中可能使用 Swift 调用了 RAC 2 中基于 OC 写的 API。为了解决这部分用户的问题,所以有了ReactiveObjCBridge 。

在项目里现在到底要引入哪些

如果你只是纯 swift 项目,你继续使用 ReactiveCocoa 。但是 RAC 依赖于 ReactiveSwift ,等于你引入了两个库。

如果你的项目是纯 OC 项目,你需要使用的是 ReactiveObjC 。这个库里面包含原来 RAC 2 的全部代码。

如果你的项目是 swift 和 OC 混编,你需要同时引用 ReactiveCocoa 和 ReactiveObjCBridge 。但是 ReactiveObjCBridge 依赖于 ReactiveObjC ,所以你就等于引入了 4 个库。

API 重新命名????

这部分的给我的感觉就是会呼吸的痛。很多 API 需要重新找一遍,而且命名也变了。

一个方向是参照 RxSwift 采用了reactive 的命名空间。比如:

1
2
3
let appearing = view.reactive.trigger(for: #selector(viewWillAppear(_:)))
 
let producer = object.reactive.values(forKeyPath: #keyPath(key))

API 都放在了 reactive 后。不再是原先的 rac_xx 。

还有一部分与 UI 相关的属性命名也改了,可能是受 rex 的影响。比如:

1
2
3
4
// 原来是 rac_text
viewModel.searchString <~ textField.reactive.textValues
 
button.reactive.pressed = CocoaAction(viewModel.commit)

还增加了生命周期 lifetime 的属性。比如:

1
signal.take(during: object.reactive.lifetime)

当 object 被回收的时候信号也停止获取 value 。

最后

让我们一起笑着活下去????。

欢迎关注我的微博:@没故事的卓同学

相关链接:RAC change log

最新文章

  1. 2.线性表-Linked list
  2. 刷新DNS命令 如何刷新DNS缓存(flushdns)
  3. IIS7 启用GZip压缩
  4. Python2
  5. Winform项目调用asp.net数据接口
  6. Spring MVC 中文乱码的解决
  7. ZOJ 2314 带上下界的可行流
  8. UVaLive 7363 A Rational Sequence (二叉树)
  9. ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例
  10. Delphi十进制和十六进制互转
  11. 小脚本一则---CDH的批量部署中,如果是从ESXI的VCENTER的模板生成的虚拟机,如何快速搞定网络网络卡配置?
  12. 关于nodejs,request模块的一个bug
  13. Spark学习笔记之RDD中的Transformation和Action函数
  14. Oracle 11g 服务启动/关闭 及 DB dump 导入
  15. Java面试系列--java基础
  16. Git 概念
  17. js的window.open()改写
  18. Eclipse:An internal error occurred during: &quot;Building workspace&quot;. GC overhead limit exceeded
  19. Java类库和常用类库介绍
  20. 百练-16年9月推免-C题-图像旋转

热门文章

  1. boost的线程池和内存池 智能指针
  2. java学习第6天
  3. Linux防火墙
  4. sqoop job 踩过的坑
  5. ipad或iPhone 访问https网站不成功
  6. Centos上DNS服务器的简单搭建
  7. 纯手工打造(不使用IDE)java web 项目
  8. media type的类型汇总
  9. hdu 5934 Bomb
  10. iterator 及 迭代器模式(转发)