RxCombine 2.0.1

RxCombine 2.0.1

RxSwift 社区Combine 社区Shai Mishali 维护。



 
依赖项
RxSwift~> 6
RxRelay~> 6
 

RxCombine 2.0.1

  • 作者
  • Shai Mishali

主题# RxCombine



Build Status Code Coverage for RxCombine on codecov
RxCombine supports CocoaPods RxCombine supports Swift Package Manager (SPM) RxCombine supports Carthage

RxCombine 为 RxSwift 和苹果的 Combine 框架提供双向类型桥接。

注意:这是一个高度实验性的,基本上只是一个快速构建的原型。我乐意接受 PR、想法、意见和建议。谢谢!:)

基本示例

ExampleApp 文件夹中查看示例应用程序。在打开项目之前运行 pod install

安装

CocoaPods

将以下行添加到您的 Podfile

pod 'RxCombine'

Swift Package Manager

将以下依赖项添加到您的 Package.swift 文件中

.package(url: "https://github.com/CombineCommunity/RxCombine.git", from: "1.6.0")

Cardhan

Cardhan 支持以预构建的二进制文件形式提供。

将以下内容添加到您的 Cartfile

github "CombineCommunity/RxCombine"

我想要...

在我的 Combine 代码中使用 RxSwift

RxCombine 提供了几个辅助工具和转换,帮助您将现有的 RxSwift 类型桥接到 Combine。

注意:如果您想了解更多关于从 RxSwift 到 Combine 的并行运算符的信息,请参阅我的RxSwift to Combine Cheat Sheet (或GitHub)。

  • Observable(以及其他ObservableConvertibleType)有一个 publisher 属性,它返回一个 AnyPublisher<Element, Swift.Error>,与底层的 Observable 相对应。
let observable = Observable.just("Hello, Combine!")

observable
    .publisher // AnyPublisher<String, Swift.Error>
    .sink(receiveValue: { value in ... })
  • RelaysSubjects 可以通过 toCombine() 方法转换为它们的 Combine 对应版本,这样您就可以像使用常规 Combine Subjects 一样使用它们,并将它们连接到现有的 subjects。
let relay = BehaviorRelay<Int>(value: 0)

// Use `sink` on RxSwift relay
let combineSubject = relay.toCombine()

combineSubject.sink(receiveValue: { value in ... })

// Use `send(value:)` on RxSwift relay
combineSubject.send(1)
combineSubject.send(2)
combineSubject.send(3)

在我的 RxSwift 代码中使用 Combine

RxCombine 提供了几个辅助工具和转换,帮助您将 Combine 代码和类型桥接到您的现有 RxSwift 代码库。

  • Publisher 有一个 asObservable() 方法,它提供一个与底层 Publisher 相对应的 Observable<Output>
// A publisher publishing numbers from 0 to 100.
let publisher = AnyPublisher<Int, Swift.Error> { subscriber in
    (0...100).forEach { _ = subscriber.receive($0) }
    subscriber.receive(completion: .finished)
}

publisher
    .asObservable() // Observable<Int>
    .subscribe(onNext: { num in ... })
  • PassthroughSubjectCurrentValueSubject 都有一个 asAnyObserver() 方法,它返回一个 AnyObserver<Output>。从您的 RxSwift 代码绑定到它会将事件推送到底层的 Combine Subject。
// Combine Subject
let subject = PassthroughSubject<Int, Swift.Error>()

// A publisher publishing numbers from 0 to 100.
let publisher = AnyPublisher<Int, Swift.Error> { subscriber in
    (0...100).forEach { _ = subscriber.receive($0) }
    subscriber.receive(completion: .finished)
}

// Convert a Publisher to an Observable and bind it
// back to a Combine Subject 🤯🤯🤯
publisher.asObservable()
         .bind(to: subject)

Observable.of(10, 5, 7, 4, 1,  6)
          .subscribe(subject.asAnyObserver())

未来想法

  • 添加 CI / 测试
  • 支持 Carthage
  • 将 SwiftUI 集成到 RxCocoa/RxSwift 中
  • 可能支持部分背压?
  • ... 你的想法? :)

许可证

MIT,当然;-) 请参阅 LICENSE 文件。

苹果徽标和 Combine 框架均为 Apple Inc. 的财产。