Skip to content
Reactive Programming in Swift
Swift Objective-C Other
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Original Slack URL brought back to life 🧟‍♂️💀 Feb 13, 2018
Documentation Fix use of articles in the ControlProperty / ControlEvent section Oct 9, 2019
Platform Omit return for single-expression methods Dec 15, 2019
Preprocessor Fix preprocessor path. Apr 15, 2019
Rx.playground Fix warnings in playground, add swiftlint disabling and reduce type-c… May 15, 2019
Rx.xcodeproj Set supported platforms for each test target, fix macOS tests Dec 15, 2019
Rx.xcworkspace Polish for RxRelay podspec. Apr 29, 2019
RxBlocking Bump version to 6.0.0-beta.1 Dec 15, 2019
RxCocoa Bump version to 6.0.0-beta.1 Dec 15, 2019
RxExample Fix FoundationNetworking imports Dec 15, 2019
RxRelay Bump version to 6.0.0-beta.1 Dec 15, 2019
RxSwift Bump version to 6.0.0-beta.1 Dec 15, 2019
RxTest Bump version to 6.0.0-beta.1 Dec 15, 2019
Sources Remove deprecated methods Dec 15, 2019
Tests Add a workaround for SR-11647 regression in OperationQueue Dec 15, 2019
assets Adds proper attribution to Rx Logo and license (at least I think it d… May 19, 2015
scripts Bump version to 6.0.0-beta.1 Dec 15, 2019
.gitignore Fix FoundationNetworking imports Dec 15, 2019
.jazzy.yml Remove deprecated methods Dec 15, 2019
.swiftlint.yml Add swiftlint build phase Jan 30, 2019
.travis.yml Update Travis to Xcode 11 / Swift 5.1 Dec 15, 2019 Release 5.0.1. Apr 30, 2019 Fixes contact info. May 21, 2016 Contribution guide improvements & link from README Nov 26, 2017
Dangerfile Updating Danger. Apr 26, 2019
Gemfile validate-podspec: run pod setup if no remote repos Dec 15, 2019
Gemfile.lock validate-podspec: run pod setup if no remote repos Dec 15, 2019 Standardizes header format. Dec 29, 2015
Package.swift Bump minimum Swift version to 5.1 Dec 15, 2019 Fix a tiny mistake Jul 6, 2019
RxBlocking.podspec Bump version to 6.0.0-beta.1 Dec 15, 2019
RxCocoa.podspec Bump version to 6.0.0-beta.1 Dec 15, 2019
RxRelay.podspec Bump version to 6.0.0-beta.1 Dec 15, 2019
RxSwift.podspec Bump version to 6.0.0-beta.1 Dec 15, 2019
RxTest.podspec Bump version to 6.0.0-beta.1 Dec 15, 2019
default.profraw Release 4.0.0-beta.0 Sep 17, 2017

Miss Electric Eel 2016 RxSwift: ReactiveX for Swift

Travis CI 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

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. This is the reason why Rx is so simple, elegant and powerful.

I came here because I want to ...

... understand
... install
... hack around
... interact
... compare
... understand the structure

RxSwift comprises five separate components depending on eachother 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 Binders, Traits, and much more. It depends on both RxSwift and RxRelay.
  • RxRelay: Provides PublishRelay and BehaviorRelay, two 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)
    .flatMapLatest { query -> Observable<[Repository]> in
        if query.isEmpty {
            return .just([])
        return searchGitHub(query)
... then bind the results to your tableview
    .bind(to: tableView.rx.items(cellIdentifier: "Cell")) {
        (index, repository: Repository, cell) in
        cell.textLabel?.text =
        cell.detailTextLabel?.text = repository.url
    .disposed(by: disposeBag)


  • Xcode 10.2
  • Swift 5.0

For Xcode 10.1 and below, use RxSwift 4.5.


Rx doesn't contain any external dependencies.

These are currently the supported 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', '~> 5'
    pod 'RxCocoa', '~> 5'

# RxTest and RxBlocking make the most sense in the context of unit/integration tests
    pod 'RxBlocking', '~> 5'
    pod 'RxTest', '~> 5'

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

$ pod install


Officially supported: Carthage 0.33 and up.

Add this to Cartfile

github "ReactiveX/RxSwift" ~> 5.0
$ 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

Create a Package.swift file.

// swift-tools-version:5.0

import PackageDescription

let package = Package(
  name: "RxTestProject",
  dependencies: [
    .package(url: "", from: "5.0.0")
  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
  • Drag Rx.xcodeproj into Project Navigator
  • Go to Project > Targets > Build Phases > Link Binary With Libraries, click + and select RxSwift-[Platform] and RxCocoa-[Platform] targets


You can’t perform that action at this time.