Reactive Programming in Swift
Go to file
2019-04-19 00:25:24 +03:00
.github Original Slack URL brought back to life 🧟‍♂️💀 2018-02-13 09:31:25 +01:00
assets Adds proper attribution to Rx Logo and license (at least I think it does) . Sry guys. 2015-05-19 20:44:29 +02:00
Documentation Update README & Docs 2019-04-10 21:55:13 +02:00
Platform Remove DeprecationWarner 2019-04-09 18:46:04 +02:00
Preprocessor Fix preprocessor path. 2019-04-15 20:31:43 +02:00
Rx.playground add corresponding 'after' set 2019-04-10 21:48:59 +02:00
Rx.xcodeproj Add -all-load linker flag to test targets 2019-04-19 00:25:24 +03:00
Rx.xcworkspace Remove RxAtomic leftovers 2019-04-06 20:52:47 +02:00
RxBlocking Migrates Scheduler API to DispatchTimeInterval and deprecate versions using Foundation.TimeInterval. 2019-04-14 15:44:53 +02:00
RxCocoa [source-breaking] Aligned collection versions of zip and combineLatest methods to fixed-parameter-sized version to require resultSelector label. 2019-04-15 20:11:58 +02:00
RxExample RxExample now uses DispatchTimeInterval 2019-04-15 23:04:30 +02:00
RxRelay Update RxRelay multi-relay bind 2019-04-11 21:11:46 +02:00
RxSwift Deprecate Completable.merge 2019-04-15 23:05:24 +02:00
RxTest Migrates Scheduler API to DispatchTimeInterval and deprecate versions using Foundation.TimeInterval. 2019-04-14 15:44:53 +02:00
scripts Updates swift docker to 5.0. 2019-04-14 17:05:16 +02:00
Sources Deprecate Completable.merge 2019-04-15 23:05:24 +02:00
Tests Deprecate Completable.merge 2019-04-15 23:05:24 +02:00
.gitignore Address PR comments by @kzaher 2019-04-07 10:17:49 +02:00
.jazzy.yml Update environment. 2019-04-14 16:39:26 +02:00
.swiftlint.yml Add swiftlint build phase 2019-01-30 20:19:57 +01:00
.travis.yml Update Travis for RxRelay 2019-04-10 21:55:13 +02:00
CHANGELOG.md Updarte CHANGELOG for Completable.zip 2019-04-15 20:34:00 +02:00
CODE_OF_CONDUCT.md Fixes contact info. 2016-05-21 16:17:17 +02:00
CONTRIBUTING.md Contribution guide improvements & link from README 2017-11-26 20:51:40 +01:00
Dangerfile Update Dangerfile to warn for modified RxTest.podspec 2018-02-10 16:38:35 +01:00
default.profraw Release 4.0.0-beta.0 2017-09-18 01:08:40 +02:00
Gemfile Danger base setup 2016-06-03 10:27:01 +03:00
Gemfile.lock Update to latest Danger gem to fix Github Markdown issues 2017-04-05 23:02:27 +02:00
LICENSE.md Standardizes header format. 2015-12-29 16:56:21 +01:00
Package.swift Seperated relays to RxRelay 2019-04-10 21:55:13 +02:00
README.md Update README & Docs 2019-04-10 21:55:13 +02:00
RxBlocking.podspec Update Podspecs to 5.0.0 2019-04-07 10:17:49 +02:00
RxCocoa.podspec Seperated relays to RxRelay 2019-04-10 21:55:13 +02:00
RxRelay.podspec Seperated relays to RxRelay 2019-04-10 21:55:13 +02:00
RxSwift.podspec Update Podspecs to 5.0.0 2019-04-07 10:17:49 +02:00
RxTest.podspec Update Podspecs to 5.0.0 2019-04-07 10:17:49 +02:00

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 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. 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 is comprised of 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.

Usage

Here's an example In Action
Define search for GitHub repositories ...
let searchResults = searchBar.rx.text.orEmpty
    .throttle(0.3, scheduler: MainScheduler.instance)
    .distinctUntilChanged()
    .flatMapLatest { query -> Observable<[Repository]> in
        if query.isEmpty {
            return .just([])
        }
        return searchGitHub(query)
            .catchErrorJustReturn([])
    }
    .observeOn(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)

Requirements

  • Xcode 10.2
  • Swift 5.0

For Xcode 10.1 and below, use RxSwift 4.5.

Installation

Rx doesn't contain any external dependencies.

These are currently the supported options:

Manual

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

CocoaPods

# Podfile
use_frameworks!

target 'YOUR_TARGET_NAME' do
    pod 'RxSwift', '~> 5'
    pod 'RxCocoa', '~> 5'
end

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

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

$ pod install

Carthage

Add this to Cartfile

github "ReactiveX/RxSwift" ~> 5.0
$ carthage update

Swift Package Manager

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", 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 git@github.com:ReactiveX/RxSwift.git
  • 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

References