Code Quality Rank: L3
Programming language: Swift
Latest version: v6.0.0-rc.2

RxSwift alternatives and similar libraries

Based on the "Reactive Programming" category.
Alternatively, view RxSwift alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of RxSwift or a related project?

Add another 'Reactive Programming' Library


RxSwift: ReactiveX for Swift

Build Status platforms pod Carthage compatible Swift Package Manager compatible

Rx is a generic abstraction of computation expressed through Observable<Element> interface.

This is a Swift version of Rx.

It tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/macOS environment.

Cross platform documentation can be found on ReactiveX.io.

Like the original Rx, its intention is to enable easy composition of asynchronous operations and event/data streams.

KVO observing, async operations and streams are all unified under [abstraction of sequence](Documentation/GettingStarted.md#observables-aka-sequences). This is the reason why Rx is so simple, elegant and powerful.

I came here because I want to ...

... understand
  • [why use rx?](Documentation/Why.md)
  • [the basics, getting started with RxSwift](Documentation/GettingStarted.md)
  • [traits](Documentation/Traits.md) - what are Single, Completable, Maybe, Driver, and ControlProperty ... and why do they exist?
  • [testing](Documentation/UnitTests.md)
  • [tips and common errors](Documentation/Tips.md)
  • [debugging](Documentation/GettingStarted.md#debugging)
  • [the math behind Rx](Documentation/MathBehindRx.md)
  • [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md)
... install
... hack around
  • with the example app. [Running Example App](Documentation/ExampleApp.md)
  • with operators in playgrounds. [Playgrounds](Documentation/Playgrounds.md)
... interact
  • All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. Join Slack Channel
  • Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md)
  • Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md)
  • Help out [Check out contribution guide](CONTRIBUTING.md)
... compare
  • [with other libraries](Documentation/ComparisonWithOtherLibraries.md).
... understand the structure

RxSwift comprises five separate components depending on each other in the following way:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   RxCocoa    โ”œโ”€โ”€โ”€โ”€โ–ถ   RxRelay    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
        โ”‚                  โ”‚        
โ”‚             RxSwift              โ”‚
        โ”‚                  โ”‚        
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚    RxTest    โ”‚    โ”‚  RxBlocking  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • RxSwift: The core of RxSwift, providing the Rx standard as (mostly) defined by ReactiveX. It has no other dependencies.
  • RxCocoa: Provides Cocoa-specific capabilities for general iOS/macOS/watchOS & tvOS app development, such as Shared Sequences, Traits, and much more. It depends on both RxSwift and RxRelay.
  • RxRelay: Provides PublishRelay, BehaviorRelay and ReplayRelay, three simple wrappers around Subjects. It depends on RxSwift.
  • RxTest and RxBlocking: Provides testing capabilities for Rx-based systems. It depends on RxSwift.
... find compatible
... see the broader vision
  • Does this exist for Android? RxJava
  • Where is all of this going, what is the future, what about reactive architectures, how do you design entire apps this way? Cycle.js - this is javascript, but RxJS is javascript version of Rx.


Here's an example In Action Define search for GitHub repositories ... let searchResults = searchBar.rx.text.orEmpty .throttle(.milliseconds(300), scheduler: MainScheduler.instance) .distinctUntilChanged() .flatMapLatest { query -> Observable<[Repository]> in if query.isEmpty { return .just([]) } return searchGitHub(query) .catchAndReturn([]) } .observe(on: MainScheduler.instance) ... then bind the results to your tableview searchResults .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { (index, repository: Repository, cell) in cell.textLabel?.text = repository.name cell.detailTextLabel?.text = repository.url } .disposed(by: disposeBag)


  • Xcode 12.x
  • Swift 5.x

For Xcode 11 and below, use RxSwift 5.x.


RxSwift doesn't contain any external dependencies.

These are currently the supported installation options:


Open Rx.xcworkspace, choose RxExample and hit run. This method will build everything and run the sample app


# Podfile

target 'YOUR_TARGET_NAME' do
    pod 'RxSwift', '6.0.0-rc.2'
    pod 'RxCocoa', '6.0.0-rc.2'

# RxTest and RxBlocking make the most sense in the context of unit/integration tests
    pod 'RxBlocking', '6.0.0-rc.2'
    pod 'RxTest', '6.0.0-rc.2'

Replace YOUR_TARGET_NAME and then, in the Podfile directory, type:

$ pod install


Each release starting with RxSwift 6 includes *.xcframework framework binaries. Simply drag the needed framework binaries to your Frameworks, Libraries, and Embedded Content section under your target's General tab.


Add this to Cartfile

github "ReactiveX/RxSwift" "6.0.0-rc.2"
$ carthage update

Carthage as a Static Library

Carthage defaults to building RxSwift as a Dynamic Library.

If you wish to build RxSwift as a Static Library using Carthage you may use the script below to manually modify the framework type before building with Carthage:

carthage update RxSwift --platform iOS --no-build
sed -i -e 's/MACH_O_TYPE = mh_dylib/MACH_O_TYPE = staticlib/g' Carthage/Checkouts/RxSwift/Rx.xcodeproj/project.pbxproj
carthage build RxSwift --platform iOS

Swift Package Manager

Note: There is a critical cross-dependency bug affecting many projects including RxSwift in Swift Package Manager. We've filed a bug (SR-12303) in early 2020 but have eno answer yet. Your mileage may vary.

Create a Package.swift file.

// swift-tools-version:5.0

import PackageDescription

let package = Package(
  name: "RxTestProject",
  dependencies: [
    .package(url: "https://github.com/ReactiveX/RxSwift.git", .exact("6.0.0-rc.2"))
  targets: [
    .target(name: "RxTestProject", dependencies: ["RxSwift", "RxCocoa"])
$ swift build

To build or test a module with RxTest dependency, set TEST=1.

$ TEST=1 swift test

Manually using git submodules

  • Add RxSwift as a submodule
$ git submodule add [email protected]:ReactiveX/RxSwift.git
  • Drag Rx.xcodeproj into Project Navigator
  • Go to Project > Targets > Build Phases > Link Binary With Libraries, click + and select RxSwift, RxCocoa and RxRelay targets