主题# RxCombine
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 ... })
Relays
和Subjects
可以通过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 ... })
PassthroughSubject
和CurrentValueSubject
都有一个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. 的财产。