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 微信群。

相关文章
相关标签/搜索