RAC 5.0 相比于 4.0 有了巨大的變化扶供,不僅是受 swift 3.0 大升級(jí)的影響炎疆,RAC 對(duì)自身項(xiàng)目結(jié)構(gòu)的也進(jìn)行了大幅度的調(diào)整发皿。這個(gè)調(diào)整就是將 RAC 拆分為四個(gè)庫(kù):ReactiveCocoa蛙卤、ReactiveSwift、ReactiveObjC宰翅、ReactiveObjCBridge弃甥。
ReactiveCocoa
現(xiàn)在的 RAC 注意力主要集中在 Swift 和 UI 層上,將原來(lái)一個(gè)基于 RAC 面向 UI 層的擴(kuò)展庫(kù) Rex 合并進(jìn)了 RAC 汁讼。
RAC 3 和 4 的主要精力在圍繞 Swift 重新打造一個(gè)響應(yīng)式編程庫(kù)潘飘。因?yàn)檫@部分的核心 API 已經(jīng)很成熟,所以現(xiàn)在將重心放在為 AppKit 和 UIKit 提供一些更好用的擴(kuò)展上掉缺。
ReactiveSwift
原來(lái) RAC 中只和 Swift 平臺(tái)相關(guān)的核心代碼被單獨(dú)抽取成了一個(gè)新框架:ReactiveSwift 卜录。
Swift 正在快速成長(zhǎng)并且成長(zhǎng)為一個(gè)跨平臺(tái)的語(yǔ)言。把只和 Swift 相關(guān)的代碼抽取出來(lái)后眶明,ReactiveSwift 就可以在其他平臺(tái)上被使用艰毒,而不只是局限在 CocoaTouch 和 Cocoa 中。
ReactiveObjC
在 RAC 3 和 4 中搜囱,RAC 也包含了 RAC 2 中的 OC 代碼〕笄疲現(xiàn)在這部分代碼被移到了 ReactiveObjC 。
這樣做的原因是因?yàn)閮蓚€(gè)庫(kù)雖然有著一樣的核心編程范式蜀肘,實(shí)際上卻是完全獨(dú)立的兩套 API 绊汹。實(shí)際的使用中,RAC 4 和 RAC 2 是完全不同的兩組用戶(hù)群扮宠,并且維護(hù)的團(tuán)隊(duì)其實(shí)也是兩組西乖。之前混在一個(gè)庫(kù)里也增加了管理的復(fù)雜度。拆分出去后也可以更加自由的維護(hù) ReactiveObjC 坛增。
ReactiveObjCBridge
在把 Swift 和 OC 的庫(kù)拆分之后問(wèn)題來(lái)了获雕,并不是所有的庫(kù)都是純 OC 和 Swift 的。有相當(dāng)大一部分項(xiàng)目處于 OC 遷移到 Swift 過(guò)程中收捣,其中可能使用 Swift 調(diào)用了 RAC 2 中基于 OC 寫(xiě)的 API届案。為了解決這部分用戶(hù)的問(wèn)題,所以有了 ReactiveObjCBridge 罢艾。
在項(xiàng)目里現(xiàn)在到底要引入哪些
如果你只是純 swift 項(xiàng)目楣颠,你繼續(xù)使用 ReactiveCocoa 。但是 RAC 依賴(lài)于 ReactiveSwift 咐蚯,等于你引入了兩個(gè)庫(kù)童漩。
如果你的項(xiàng)目是純 OC 項(xiàng)目,你需要使用的是 ReactiveObjC 仓蛆。這個(gè)庫(kù)里面包含原來(lái) RAC 2 的全部代碼睁冬。
如果你的項(xiàng)目是 swift 和 OC 混編挎春,你需要同時(shí)引用 ReactiveCocoa 和 ReactiveObjCBridge 看疙。但是 ReactiveObjCBridge 依賴(lài)于 ReactiveObjC 豆拨,所以你就等于引入了 4 個(gè)庫(kù)。
API 重新命名????
這部分的給我的感覺(jué)就是會(huì)呼吸的痛能庆。很多 API 需要重新找一遍施禾,而且命名也變了。
一個(gè)方向是參照 RxSwift 采用了reactive 的命名空間搁胆。比如:
let appearing = view.reactive.trigger(for: #selector(viewWillAppear(_:)))
let producer = object.reactive.values(forKeyPath: #keyPath(key))
API 都放在了 reactive 后弥搞。不再是原先的 rac_xx 。
還有一部分與 UI 相關(guān)的屬性命名也改了渠旁,可能是受 rex 的影響攀例。比如:
// 原來(lái)是 rac_text
viewModel.searchString <~ textField.reactive.textValues
button.reactive.pressed = CocoaAction(viewModel.commit)
還增加了生命周期 lifetime 的屬性。比如:
signal.take(during: object.reactive.lifetime)
當(dāng) object 被回收的時(shí)候信號(hào)也停止獲取 value 顾腊。
如果你只是純 swift 項(xiàng)目粤铭,你繼續(xù)使用 ReactiveCocoa 。但是 RAC 依賴(lài)于 ReactiveSwift 杂靶,等于你引入了兩個(gè)庫(kù)梆惯。
如果你的項(xiàng)目是純 OC 項(xiàng)目,你需要使用的是 ReactiveObjC 吗垮。這個(gè)庫(kù)里面包含原來(lái) RAC 2 的全部代碼垛吗。
如果你的項(xiàng)目是 swift 和 OC 混編,你需要同時(shí)引用 ReactiveCocoa 和 ReactiveObjCBridge 烁登。但是 ReactiveObjCBridge 依賴(lài)于 ReactiveObjC 怯屉,所以你就等于引入了 4 個(gè)庫(kù)。**
因?yàn)槟壳绊?xiàng)目語(yǔ)言主要是OC,所以直接引入了
pod 'ReactiveCocoa', '~>5.0.1'
pod 'ReactiveObjC', '2.1.2'
就可以了
最后
讓我們一起笑著活下去????饵沧。