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ù)的團(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 寫的 API熙卡。為了解決這部分用戶的問(wèn)題杖刷,所以有了 ReactiveObjCBridge 。
在項(xiàng)目里現(xiàn)在到底要引入哪些
如果你只是純 swift 項(xiàng)目驳癌,你繼續(xù)使用 ReactiveCocoa 滑燃。但是 RAC 依賴于 ReactiveSwift ,等于你引入了兩個(gè)庫(kù)颓鲜。
如果你的項(xiàng)目是純 OC 項(xiàng)目表窘,你需要使用的是 ReactiveObjC 典予。這個(gè)庫(kù)里面包含原來(lái) RAC 2 的全部代碼。
如果你的項(xiàng)目是 swift 和 OC 混編乐严,你需要同時(shí)引用 ReactiveCocoa 和 ReactiveObjCBridge 瘤袖。但是 ReactiveObjCBridge 依賴于 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 奖慌。
最后
讓我們一起笑著活下去??。
歡迎關(guān)注我的微博:@沒(méi)故事的卓同學(xué)
相關(guān)鏈接:
RAC change log