What’s new in RxSwift 5

原文連接git

做者 | Shai Mishaligithub

來源 | medium.com/@freak4pc/w…編程

幾天前 RxSwift 5[1] 終於發佈了,這個版本在源碼層面沒有太大的變更,更多的是捨棄了一些東西,同時重命名了一些東西,另外也有一些底層的改進,讓咱們來一塊兒看看。swift

將 Relay 拆分紅一個獨立的框架 -- RxRelay

Relay 是 Subject 上的一個很好的抽象層,可讓您在不關心 errors 或 completion events 的狀況下中繼元素。從它們被添加到 RxSwift 後,一直是做爲 RxCocoa 工程的一部分而存在的。數組

一些開發人員對此並不滿意,由於這意味着必須導入 RxCocoa 才能使用 Relay。 另外因爲 Linux 下沒有 RxCocoa,因此在 Linux 環境下也沒法使用 Relay。安全

因爲上述緣由,在 Swift 5 中將 Relays 獨立成 RxRelay [2],並調整了 RxSwift 的依賴圖,以下:微信

RxSwift 4 的依賴圖

RxSwift 5 的依賴圖

這讓您能夠只使用 RxSwift 和 RxRelay,而不依賴於 RxCocoa(若是您不須要它),而且還與 RxJava 保持一致,在 RxJava 中,Relay 是一個單獨的框架。併發

注意:這是向後兼容的更改,由於 RxCocoa 直接導入了 RxRelay。意思是,您能夠繼續導入 RxCocoa 而無需導入 RxRelay,一切都會像之前同樣工做。框架

棄用 TimeInterval,改用 DispatchTimeInterval

RxSwift 5 對 Schedulers 進行了重構,棄用了 TimeInterval,轉而使用 DispatchTimeInterval。當須要亞秒級時序時,DispatchTimeInterval 能夠得到更好的事件調度粒度和更高的穩定性。ide

這會影響全部基於時間的操做符,例如 throttle、timeout、delay、take 等。一個頗有意思的反作用是,這消除了 take 的歧義。

RxSwift 4.x:

RxSwift 4 中使用 TimeInterval

RxSwift 5.x:

RxSwift 5 中使用 DispatchTImeInterval

Variable 最終被棄用

Variable 是早期添加到 RxSwift 中的一個概念,它容許您經過「設置」和「獲取」當前值來建立一個命令式的 bridge。這是一個看似有用的措施,可讓開發人員更容易上手使用 RxSwift,直到他們徹底適應「響應性思惟」。

不過這種結構被證實是有問題的,由於開發人員嚴重濫用這種結構來建立高度命令式的系統,而不是使用 Rx 的聲明式性質。這對於響應式編程的初學者來講尤爲常見,而且在概念上阻止了許多人理解這是一種很差的作法和代碼味道。這就是爲何在 RxSwift 4.x 中已經使用運行時警告來告知將棄用 Variable 的緣由。

在 RxSwift 5 中,它如今已被正式徹底棄用,若是您須要這種行爲,建議的方法是使用 BehaviorRelay(或 BehaviorSubject)。

RxSwift 4.x:

RxSwift 4.x 中棄用 Variable 的警告

RxSwift 5.x:

RxSwift 5.x 中徹底棄用 Variable

新增 do(on:) 重載

do 是一個很棒的操做符,當你想要執行某些反作用(如日誌記錄)或只是「監聽」流的中間過程。

爲了與 RxJava 保持一致,RxSwift 如今不只提供 do(onNext:),還提供如 do(afterNext:) 這樣的重載。onNext 表示元素髮出的時刻,而 afterNext 表示發出並向下遊推送的時刻。

RxSwift 4.x:

RxSwift 4.x 提供了 do(onNext:onError:onCompleted:)

RxSwift 5.x:

RxSwift 5.x 同時提供了 do(afterNext:afterError:afterCompleted:)

bind(to:) 如今支持多個觀察者

在某些狀況下,您必須將流綁定到多個觀察者。在 RxSwift 4 中,您一般只是複製綁定代碼:

RxSwift 4一次只容許綁定到一個觀察者

RxSwift 5 如今支持綁定到多個觀察者:

RxSwift 5容許綁定到可變參數列表

這仍然解析到單個 Disposable,這意味着它向後兼容單觀察者變體。

一個新的 compactMap 操做符

做爲開發人員,您可能常常處理 Optional 值的流。爲了解包這些值,社區已經有了本身的解決方案,例如來自 RxSwiftExt 的解包運算符或來自 RxOptional 的 filterNil。

RxSwift 5 添加了一個新的 compactMap 操做符,以與 Swift 標準庫保持一致,將此功能引入核心庫。

RxSwift 4.x:

RxSwift 4沒有內置解包可選流

RxSwift 5.x:

RxSwift 5.x提供了compactMap來解包可選流

toArray() 如今返回 Single

toArray() 是一個操做符,它在流完成後將整個流做爲數組發出。

一直以來這個操做符老是返回一個 Observable,可是因爲 Traits 的引入 - 特別是 Single,將返回類型更改成 Single 以提供該類型的安全性和僅保證今後操做符獲取單個發射值是頗有意義的。

RxSwift 4.x:

toArray() 在 RxSwift 4.x 中返回 Observable<T>

RxSwift 5.x:

toArray() 在 RxSwift 5.x 中返回 Single<T>

泛型約束命名整理

RxSwift 是泛型約束的重度使用者。從早期開始,庫就使用單字母約束來描述某些類型。 例如,ObservableType.E 表示 Observable 流的泛型類型。

這樣能夠正常工做,但會引發一些混淆,例如 O 能夠表明不一樣場景中的 Observable 和 Observer,或 S 能夠表明 Subject 和 Sequence.

此外,這些單字母約束並無提供良好的自我描述,並使非代碼貢獻者很難理解文檔。

出於這些緣由,咱們對私有和公共接口的大多數泛型約束進行了大修,使其具備更多信息以便理解。

The most widely impacting rename is E and ElementType to simply Element.

影響最大的重命名將 E 和 ElementType 改成 Element。

RxSwift 4.x:

在 RxSwift 4 中擴展 Observable 使用 E 泛型約束

RxSwift 5.x:

在 RxSwift 5 中擴展 Observable 使用 Element 泛型約束

泛型重命名很是普遍。下面是一個大體完整的列表。這些更改中的大多數都與 RxSwift 的內部 API 有關,其中只有少數會影響到開發人員:

  • E 和 ElementType 重命名爲 Element;
  • TraitType 重命名爲 Trait;
  • SharedSequence.S 重命名爲 SharedSequence.SharingStrategy;
  • 依狀況 O 被重命名爲 Observer 和 Source;
  • C 和 S 分別重命名爲 Collection 和 Sequence;
  • 依狀況 S 也被重命名爲 Subject;
  • R 被重命名爲 Result;
  • ReactiveCompatible.CompatibleType 重命名爲ReactiveCompatible.ReactiveBase。

社區項目

許多 RxSwift 社區項目已經遷移到 RxSwift 5 併發布了相應的版本,所以遷移過程應該相對順利。已遷移的一些項目包括:RxSwiftExt,RxDataSources,RxAlamofire,RxOptional 等。

總結

上面列出的更改是開發人員會遇到的主要更改,可是還有更多小的修補程序超出咱們帖子的範圍,例如在 Linux 下徹底修復與 Swift 5 的兼容性、輕微異常等。

請隨時查看完整的更改日誌並參與官方存儲庫中的討論:github.com/ReactiveX/R…

參考

關注咱們

歡迎關注咱們的公衆號:zsxjtip,也歡迎加入咱們的羣組討論問題。能夠加微信 coldlight_hh/wsy9871 進入咱們的 iOS/flutter 微信羣。

相關文章
相關標籤/搜索