RxSwift4升級至RxSwift5_Variable->BehaviorRelay

本棲湖觀富士山日出

起因

新加入了一個(gè)項(xiàng)目碱工,翻了兩遍代碼后也沒新的需求進(jìn)來娃承,
就這么閑了幾天后,負(fù)責(zé)帶我入項(xiàng)目的老哥鬼鬼祟祟地摸到了我座位邊上...
“是不是沒活干痛垛?”
“...還草慧,還好”
“剛好第三方庫有段日子沒更新了,要不你都更到最新版本匙头,適配和測試做一下漫谷?”
“...!”

RxSwift4->5

由于是個(gè)小項(xiàng)目蹂析,本身用的第三方庫也不多舔示,API基本沒有變化碟婆,理論上是個(gè)輕松的活,
直到下面一行diff出現(xiàn)

- github "ReactiveX/RxSwift" "4.5.0"
+ github "ReactiveX/RxSwift" "5.0.1"

打開項(xiàng)目Build一下

rxswift5_warning.png

哦嚯惕稻?竖共!

GG……

Variable被正式廢棄并打出deprecated警告

根據(jù)RxSwift開發(fā)者的post
Variable有以下問題

  • it's not a standard cross platform concept so it's out of place in RxSwift target.
  • it doesn't have an extensible counterpart for event management (PublishRelay). It models state only.
  • it is naming is not consistent with *Relay
  • it has an inconsistent memory management model compared to other parts of RxSwift (complete on dealloc)

大致意思是Variable不是一個(gè)跨平臺(tái)的概念俺祠,也不符合Rx的設(shè)計(jì)標(biāo)準(zhǔn)公给,因此在RxSwift的未來發(fā)展中沒有一席之地。
RxSwift的中文文檔也提到

...許多開發(fā)者濫用 Variable蜘渣,來構(gòu)建 重度命令式 系統(tǒng)淌铐,而不是 Rx 的 聲明式 系統(tǒng)。這對于新手很常見蔫缸,并且他們無法意識(shí)到腿准,這是代碼的壞味道。...

對非科班出身程序員的我來說很難產(chǎn)生共鳴...歸納下來就是Variable被生父養(yǎng)母踢出了家門拾碌。
而很明顯的是吐葱,這個(gè)項(xiàng)目組的先人們就是上文所述的濫用Variable的開發(fā)者。
華麗麗地留下了上百條warning

Variable->BehaviorRelay

不管是warning內(nèi)容還是官方文檔都確切的注明了用BehaviorRelay來替代Variable校翔,所以沒有什么太多需要考慮弟跑。
Variable和BehaviorRelay唯一的區(qū)別是Variable被釋放時(shí)會(huì)發(fā)出一個(gè)Complete事件,而Bahavior沒有展融。
萬幸的事本項(xiàng)目沒有subscribeVariable的onComplete的事件窖认,不需要進(jìn)行結(jié)構(gòu)性調(diào)整。
大部分改動(dòng)利用Xcode的replace功能告希,用正則表達(dá)式匹配后修改即可。

1. 修改聲明
func setTitle(_ text: Variable<String>) {
    ...
}

Variable<T>需要改成BahaviorRelay<T>
很簡單烧给,把: Variable全用: BahaviorRelay給replace掉燕偶,解決
find: :( *)Variable
replace: :$1BehaviorRelay

2. 修改初始化方法
final class AlbumListViewModel: ViewModel {
    var myAlbums = Variable<[PhotoAlbum]>([])
    var memberAlbums = Variable<[PhotoAlbum]>([])
    var numOfAlbum = Variable<[Int]>([])
    ...
}

由于聲明已經(jīng)改完了,所以不用在意(本身這個(gè)項(xiàng)目內(nèi)Variable的聲明就都是隱式的)
只需要把

var myAlbums = Variable<[PhotoAlbum]>([])

修改為

var myAlbums = BehaviorRelay<[PhotoAlbum]>(value: [])

用以下正則修改完成
find: (var|let)(.*)= Variable(.*)\((.*)\)
replace: $1$2= BehaviorRelay$3\(value: $4\)

3. 修改賦值
myAlbums.value = albumResponse.myAlbums
memberAlbums.value = albumResponse.memberAlbums

由于BehaviorRelay的value屬性為只讀础嫡,現(xiàn)在黃色的warning沒了指么,蹦出一大堆紅色的error...
應(yīng)使用BehaviorRelay的accept(:)函數(shù)來賦新值,
將以上表達(dá)式修改為

myAlbums.accept(albumResponse.myAlbums)

(插入)
有可能出現(xiàn)換行的情況
比如

licenses.value = licenseItems.compactMap { (licenseItem) -> LicenseItem? in
    ...
}

正則小白的作者不知道怎么將特定結(jié)尾的字符串除外榴鼎,于是先匹配出特殊情況伯诬,手動(dòng)修改。
以下情況可能出現(xiàn)換行
find: (.*)\.value = (.*) (in|\{|\(|\.|\[)$


用正則replace一次搞定
找出規(guī)律巫财,用以下正則修改
find: (.*)\.value = (.*)$
replace: $1.accept($2)

4. 修改自增自減
var maxSelectedNum = BehaviorRelay<Int>(value: -1)
...
maxSelectedNum.value += 1

由于value為只讀屬性盗似,需要設(shè)置一個(gè)中間變量將value拷貝,然后修改中間變量平项。
這里新建一個(gè)文件赫舒,對BehaviorRelay進(jìn)行擴(kuò)展悍及,提供兩個(gè)新的accept函數(shù)。

// BehaviorRelay+Update.swift

import RxRelay

extension BehaviorRelay {

    /// Accept update of current value
    /// - Parameter update: mutate current value in closure
    func acceptUpdate(byMutating update: (inout Element) -> Void) {
        var newValue = value
        update(&newValue)
        accept(newValue)
    }

    /// Accept new value generated from current value
    /// - Parameter update: generate new value from current, and return it
    func acceptUpdate(byNewValue update: (Element) -> Element) {
        accept(update(value))
    }

}

然后我們就可以將原代碼修改為

maxSelectedNum.acceptUpdate(byMutating: { $0 += 1 })
// or
maxSelectedNum.acceptUpdate(byNewValue: { $0 + 1 }) //隱式return

同樣使用正則+replace一鍵搞定
find: (.*)\.value (\+|\-)= ([0-9]+)
replace: $1.acceptUpdate(byNewValue: { \$0 $2 $3 })

5. 修改泛型為數(shù)組接癌,字典等的BehaviorRelay的mutating函數(shù)
var selectedMembers = BehaviorRelay<[Member]>(value: [])
...
selectedMembers.value.append(member)

在上面的BehaviorRelay擴(kuò)展中心赶,已經(jīng)添加了acceptUpdate(byMutating:)函數(shù),只需將上述代碼改為

selectedMembers.value.acceptUpdate(byMutating: { $0.append(member) })

即可
由于這個(gè)正則實(shí)在不好寫缺猛,全部手動(dòng)解決

6. 添加import

RxRelay被包含在RxCocoamodule中缨叫,但沒有被包含在RxSwift下,
Variable是被定義在RxSwift中的荔燎,
所以要在需要的地方添加import RxRelay

其它

RxSwift 5的其他更新比如弯汰,throttle的參數(shù)timeInterval改成了DispatchTimeInterval類型等,因?yàn)樵谶@個(gè)項(xiàng)目中影響較小湖雹,修改起來比較方便咏闪,在此略過不提
RxSwift5的更新可以參考這篇文章


完工!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摔吏,一起剝皮案震驚了整個(gè)濱河市鸽嫂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌征讲,老刑警劉巖据某,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诗箍,居然都是意外死亡癣籽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門滤祖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筷狼,“玉大人,你說我怎么就攤上這事匠童」〔模” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵汤求,是天一觀的道長俏险。 經(jīng)常有香客問我,道長扬绪,這世上最難降的妖魔是什么竖独? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮挤牛,結(jié)果婚禮上莹痢,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好格二,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布劈彪。 她就那樣靜靜地躺著冰更,像睡著了一般莫其。 火紅的嫁衣襯著肌膚如雪纽绍。 梳的紋絲不亂的頭發(fā)上谬返,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天剃氧,我揣著相機(jī)與錄音伐谈,去河邊找鬼医吊。 笑死焕议,一個(gè)胖子當(dāng)著我的面吹牛挠日,可吹牛的內(nèi)容都是我干的疮绷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚣潜,長吁一口氣:“原來是場噩夢啊……” “哼冬骚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懂算,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤只冻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后计技,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喜德,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年垮媒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舍悯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睡雇,死狀恐怖萌衬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情入桂,我是刑警寧澤奄薇,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站抗愁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呵晚。R本人自食惡果不足惜蜘腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饵隙。 院中可真熱鬧撮珠,春花似錦、人聲如沸金矛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娶耍,卻和暖如春免姿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榕酒。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工胚膊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人想鹰。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓紊婉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辑舷。 傳聞我的和親對象是個(gè)殘疾皇子喻犁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容