Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Rxswift | 23,594 | 2,709 | 3 days ago | 75 | January 14, 2022 | 31 | mit | Swift | ||
Reactive Programming in Swift | ||||||||||
Mobx.dart | 2,307 | 32 | 61 | 10 days ago | 118 | May 05, 2023 | 67 | mit | Dart | |
MobX for the Dart language. Hassle-free, reactive state-management for your Dart and Flutter apps. | ||||||||||
Siesta | 2,162 | 39 | a year ago | 27 | March 31, 2020 | 26 | mit | Swift | ||
The civilized way to write REST API clients for iOS / macOS | ||||||||||
Reactivekit | 1,217 | 83 | 6 months ago | 89 | April 16, 2020 | 33 | mit | Swift | ||
A Swift Reactive Programming Kit | ||||||||||
Scala.rx | 973 | 1 | 11 | 2 years ago | 3 | March 19, 2020 | 19 | Scala | ||
An experimental library for Functional Reactive Programming in Scala | ||||||||||
Reactor.js | 799 | 2 months ago | 6 | April 19, 2020 | mit | JavaScript | ||||
Simple reactive programming without a framework | ||||||||||
Observable | 343 | 5 | 3 years ago | 16 | December 28, 2020 | 3 | mit | Swift | ||
The easiest way to observe values in Swift. | ||||||||||
React Reactive Form | 300 | 10 | 2 | 2 months ago | 35 | December 06, 2022 | 16 | mit | JavaScript | |
Angular like reactive forms in React. | ||||||||||
Signalkit | 242 | 7 years ago | 7 | March 08, 2016 | 4 | mit | Swift | |||
SignalKit is a reactive Swift framework with focus on clean and readable API. | ||||||||||
Airstream | 209 | 3 | 3 months ago | 27 | January 16, 2023 | 16 | mit | Scala | ||
State propagation and event streams with mandatory ownership and no glitches |
Rx is a generic abstraction of computation expressed through Observable<Element>
interface, which lets you broadcast and subscribe to values and other events from an Observable
stream.
RxSwift is the Swift-specific implementation of the Reactive Extensions standard.
While this version aims to stay true to the original spirit and naming conventions of Rx, this project also aims to provide a true Swift-first API for Rx APIs.
Cross platform documentation can be found on ReactiveX.io.
Like other Rx implementations, RxSwift's intention is to enable easy composition of asynchronous operations and streams of data in the form of Observable
objects and a suite of methods to transform and compose these pieces of asynchronous work.
KVO observation, async operations, UI Events and other streams of data are all unified under abstraction of sequence. This is the reason why Rx is so simple, elegant and powerful.
Single
, Completable
, Maybe
, Driver
, and ControlProperty
... and why do they exist?RxSwift is as compositional as the asynchronous work it drives. The core unit is RxSwift itself, while other dependencies can be added for UI Work, testing, and more.
It comprises five separate components depending on each other in the following way:
RxCocoa RxRelay
RxSwift
RxTest RxBlocking
RxSwift
and RxRelay
.PublishRelay
, BehaviorRelay
and ReplayRelay
, three simple wrappers around Subjects. It depends on RxSwift
.RxSwift
.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) |
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
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'RxSwift', '6.6.0'
pod 'RxCocoa', '6.6.0'
end
# RxTest and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do
pod 'RxBlocking', '6.6.0'
pod 'RxTest', '6.6.0'
end
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.
Note: If you're using
RxCocoa
, be sure to also drag RxCocoaRuntime.xcframework before importingRxCocoa
.
Add this to Cartfile
github "ReactiveX/RxSwift" "6.6.0"
$ carthage update
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
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 no answer yet. Your mileage may vary. A partial workaround can be found here.
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.6.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
$ git submodule add [email protected]:ReactiveX/RxSwift.git
Rx.xcodeproj
into Project NavigatorProject > Targets > Build Phases > Link Binary With Libraries
, click +
and select RxSwift
, RxCocoa
and RxRelay
targets