Swiftpack.co - Package - freak4pc/RxCombine

RxCombine



RxCombine supports CocoaPods RxCombine supports Swift Package Manager (SPM) RxCombine supports Carthage

RxCombine provides bi-directional type bridging between RxSwift and Apple's Combine framework.

Note: This is highly experimental, and basically just a quickly-put-together PoC. I gladly accept PRs, ideas, opinions, or improvements. Thank you ! :)

Basic Examples

Check out the Example App in the ExampleApp folder. Run pod install before opening the project.

Installation

CocoaPods

Add the following line to your Podfile:

pod 'RxCombine'

Swift Package Manager

Add the following dependency to your Package.swift file:

.package(url: "https://github.com/freak4pc/RxCombine.git", from: "1.0.0")

Carthage

Carthage support is offered as a prebuilt binary.

Add the following to your Cartfile:

github "freak4pc/RxCombine"

I want to ...

Use RxSwift in my Combine code

RxCombine provides several helpers and conversions to help you bridge your existing RxSwift types to Combine.

Note: If you want to learn more about the parallel operators in Combine from RxSwift, check out my RxSwift to Combine Cheat Sheet (or on GitHub).

  • Observable (and other ObservableConvertibleTypes) have a publisher property which returns a AnyPublisher<Element, Swift.Error> mirroring the underlying Observable.
let observable = Observable.just("Hello, Combine!")

observable
    .publisher // AnyPublisher<String, Swift.Error>
    .sink(receiveValue: { value in ... })
  • Relays and Subjects conform to Combine.Subject, so you can use them as if they are regular Combine Subjects.
let relay = BehaviorRelay<Int>(value: 0)

// Use `sink` on RxSwift relay
relay
    .sink(receiveValue: { value in ... })

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

Use Combine in my RxSwift code

RxCombine provides several helpers and conversions to help you bridge Combine code and types into your existing RxSwift codebase.

  • Publishers have a asObservable() method, providing an Observable<Output> mirroring the underlying Publisher.
// 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 and CurrentValueSubject both have a asAnyObserver() method which returns a AnyObserver<Output>. Binding to it from your RxSwift code pushes the events to the underlying 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())

Future ideas

  • Add CI / Tests
  • ~~Carthage Support~~
  • Bridge SwiftUI with RxCocoa/RxSwift
  • Partial Backpressure support, perhaps?
  • ... your ideas? :)

License

MIT, of course ;-) See the LICENSE file.

The Apple logo and the Combine framework are property of Apple Inc.

Github

link
Stars: 441
Help us keep the lights on

Dependencies

Used By

Total: 0

Releases

1.3.0 - Sep 16, 2019

Supports Xcode 11 GM

1.2.0 - Jul 3, 2019

Updated for Xcode 11 beta 3.

Apple removed the AnyPublisher initializer that takes a closure (similar to RxSwift's Observable.create). Meaning creating a Publisher can only be done with an intermediary type. See RxPublisher.

1.1.0 - Jun 14, 2019

  • Add Observable.asPublisher() as an alias to the publisher property (Thanks @jdisho!)
  • Support Carthage via Prebuilt Binary

1.0.0 - Jun 12, 2019

Initial Release! 🎉