CombineRx 库包含一系列函数,用于帮助 RxSwift 和 Apple 的 Combine 框架之间的互操作性。
为了将 Combine 的 Publisher
转换为 RxSwift 的 Observable
,您可以使用 asObservable()
函数。 操作方法如下:
import Combine
import RxSwift
import CombineRx
let myBridgedObservable = Just(0).asObservable()
也可以使用 .asInfallible()
将 Combine 的 Publisher
转换为 RxSwift 的 Infallible
。 操作方法如下:
import Combine
import RxSwift
import CombineRx
let myBridgedInfallible = Just(0)
.setFailureType(to: Never.self)
.asInfallible() // Works when `Failure` type is `Never`.
let myBridgedInfallible = Just(0)
.setFailureType(to: Error.self)
.asInfallible(onErrorRecover: { error in ... }) // Handle the error
let myBridgedInfallible = Just(0)
.setFailureType(to: Error.self)
.asInfallible(onErrorFallbackTo: Just<Int>(42).eraseToAnyPublisher()) // Use a fallback `Publisher`
let myBridgedInfallible = Just(0)
.setFailureType(to: Error.self)
.asInfallible(onErrorJustReturn: 42) // Use a fallback value
为了将 RxSwift 的 Observable
转换为 Combine 的 Publisher
,您可以使用 asPublisher(withBufferSize:andBridgeBufferingStrategy:)
函数。 操作方法如下:
import Combine
import RxSwift
import CombineRx
let myBridgedPublisher1 = Observable.just(0).asPublisher(withBufferSize: 1, andBridgeBufferingStrategy: .error)
let myBridgedPublisher2 = Observable.from([0, 1, 2, 3]).asPublisher(withBufferSize: 4, andBridgeBufferingStrategy: .error)
也可以使用 asPublisher(withBufferSize:andBridgeBufferingStrategy:)
将 RxSwift 的 Infallible
转换为 Combine 的 Publisher
。 操作方法如下:
import Combine
import RxSwift
import CombineRx
let myBridgedPublisher1 = Infallible.just(0).asPublisher(withBufferSize: 1, andBridgeBufferingStrategy: .dropOldest)
let myBridgedPublisher2 = Infallible.from([0, 1, 2, 3]).asPublisher(withBufferSize: 4, andBridgeBufferingStrategy: .dropOldest)
RxSwift 和 Combine 之间的一个区别是,Combine 遵循反压机制,以确保 Publisher
只产生 Subscriber
请求的元素数量。 这可以防止元素在 Publisher
的缓冲区中累积速度快于下游 Subscriber 处理速度的情况,因为这可能导致内存溢出错误和因系统资源消耗过高而导致性能下降。 Combine 通过 Publisher
的合同义务将反压应用到上游,即仅在 Subscriber
通过 Subscribers.Demand
请求时才发出元素。
RxSwift 的 Observable
在这方面有所不同,因为它们依赖于具有无限生产速率的源。因此,在桥接到 Combine 的 Publisher
时,我们必须维护一个缓冲区或相应地删除元素,以满足下游 Subscriber 的需求。
这就是 asPublisher(withBufferSize:andBridgeBufferingStrategy:)
需要 withBufferSize
和 andBridgeBufferingStrategy
参数的原因。 withBufferSize
用于手动设置缓冲区大小(理想情况下,直接基于序列中预期元素的数量)。 andBridgeBufferingStrategy
是达到最大缓冲区容量时采用的策略。 为了与原生 Combine 策略保持一致,它可以是 error
(其中任何缓冲区溢出都被视为错误),dropNewest
(其中缓冲区中已存在的元素被保留,任何新元素被忽略),或者最后是 dropOldest
(其中新元素被添加到缓冲区并替换已存在的旧元素)。
有关 Combine 使用反压的更多信息,请访问 此处。
目前可以使用 Swift Package Manager 安装此库。 为此,请使用 Xcode 将当前存储库添加为包依赖项,或在您的 Package.swift
文件中包含以下内容:
import PackageDescription
let package = Package(
...
dependencies: [
.package(url: "https://github.com/Jackstone92/CombineRx", .upToNextMajor(from: "2.0.0")),
],
...
targets: [
.target(name: "MyTarget", dependencies: ["CombineRx"]),
]
)
版权所有 2020 © Jack Stone
CombineRx 在 MIT 许可证 下提供。