CombineRx

Run Tests License codecov

CombineRx 库包含一系列函数,用于帮助 RxSwift 和 Apple 的 Combine 框架之间的互操作性。

Combine 和 RxSwift 之间的互操作性

Combine 到 RxSwift

为了将 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 到 Combine

为了将 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:) 需要 withBufferSizeandBridgeBufferingStrategy 参数的原因。 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

CombineRxMIT 许可证 下提供。