Reactive Programming in Swift
Swift Objective-C Other
Failed to load latest commit information.
.github Improves issue template. Oct 20, 2016
Documentation Removes ``. Oct 19, 2016
Platform Improves dispatch queue detection logic. Oct 22, 2016
Preprocessor Migrate to Xcode 8 GM Sep 8, 2016
Rx.playground Renames `OSX` to `macOS`. Oct 19, 2016
Rx.xcodeproj Improves dispatch queue detection logic. Oct 22, 2016
Rx.xcworkspace Updates RxDataSources Oct 19, 2016
RxBlocking Release 3.0.0-rc.1 Oct 16, 2016
RxCocoa Replaces `RX_SAFE_ERROR` with `RX_THROW_ERROR`. Oct 22, 2016
RxExample Fixes code example in comments of RxTableViewExtensions that didn't c… Oct 20, 2016
RxSwift Improves dispatch queue detection logic. Oct 22, 2016
RxTest Moves DataStructures to Platform. Oct 19, 2016
Sources Fixes Linux. Oct 22, 2016
Tests Fixes Linux. Oct 22, 2016
assets Adds proper attribution to Rx Logo and license (at least I think it d… May 19, 2015
scripts Fixes Linux. Oct 22, 2016
.gitignore RxSwift compiles first time on Linux. Dec 26, 2015
.jazzy.yml Improves dispatch queue detection logic. Oct 22, 2016
.swift-version Adds `.swift-version`. Oct 20, 2016
.travis.yml Moves Danger to Linux environment. Oct 22, 2016 Adds `RxTests` rename information to Oct 16, 2016 Fixes contact info. May 21, 2016 Improves Jun 26, 2016
Dangerfile Adds `swift-3.0` as valid branch in Dangerfile. Jul 10, 2016
Gemfile Danger base setup Jun 3, 2016
Gemfile.lock Danger base setup Jun 3, 2016 Standardizes header format. Dec 29, 2015
Package.swift Prepares Package.swift for build server. Oct 16, 2016 Removes ``. Oct 19, 2016
RxBlocking.podspec Adds platform to all Podspecs. Oct 16, 2016
RxCocoa.podspec Renames `OSX` to `macOS`. Oct 19, 2016
RxSwift.podspec Renames `OSX` to `macOS`. Oct 19, 2016
RxTest.podspec Adds platform to all Podspecs. Oct 16, 2016

Miss Electric Eel 2016 RxSwift: ReactiveX for Swift

Travis CI platforms pod Carthage compatible Swift Package Manager compatible

About Rx

⚠️ This readme describes RxSwift 3.0 version that requires Swift 3.0.

⚠️ If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and swift-2.3 branch.

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
... 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
    .throttle(0.3, scheduler: MainScheduler.instance)
    .flatMapLatest { query -> Observable<[Repository]> in
        if query.isEmpty {
            return .just([])

        return searchGitHub(query)
... then bind the results to your tableview
    .bindTo(tableView.rx.items(cellIdentifier: "Cell")) {
        (index, repository: Repository, cell) in
        cell.textLabel?.text =
        cell.detailTextLabel?.text = repository.url


  • Xcode 8.0
  • Swift 3.0


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',    '3.0.0-rc.1'
    pod 'RxCocoa',    '3.0.0-rc.1'

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

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

⚠️ If you want to use CocoaPods with Xcode 8.0 and Swift 3.0, you might need to add the following lines to your podfile: ⚠️

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0'
      config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
$ pod install


Add this to Cartfile

github "ReactiveX/RxSwift" "3.0.0-rc.1"
$ carthage update

Swift Package Manager

Create a Package.swift file.

import PackageDescription

let package = Package(
    name: "RxTestProject",
    targets: [],
    dependencies: [
        .Package(url: "", Version(3, 0, 0, prereleaseIdentifiers: ["rc"]))

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