|
|
||
|---|---|---|
| Documentation | ||
| Preprocessor | ||
| Rx.playground | ||
| Rx.xcodeproj | ||
| Rx.xcworkspace | ||
| RxBlocking | ||
| RxCocoa | ||
| RxExample | ||
| RxSwift | ||
| RxTests | ||
| Sources | ||
| Tests | ||
| assets | ||
| scripts | ||
| .gitignore | ||
| .jazzy.yml | ||
| .travis.yml | ||
| CHANGELOG.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| Dangerfile | ||
| Gemfile | ||
| Gemfile.lock | ||
| ISSUE_TEMPLATE.md | ||
| LICENSE.md | ||
| Package.swift | ||
| README.md | ||
| RxBlocking.podspec | ||
| RxCocoa.podspec | ||
| RxSwift.podspec | ||
| RxTests.podspec | ||
README.md
RxSwift: ReactiveX for Swift
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/OSX 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
- why use rx?
- the basics, getting started with RxSwift
- units - what is
Driver,ControlProperty, andVariable... and why do they exist? - testing
- tips and common errors
- debugging
- the math behind Rx
- what are hot and cold observable sequences?
- what does the the public API look like?
... install
- Integrate RxSwift/RxCocoa with my app. Installation Guide
... hack around
- with the example app. Running Example App
- with operators in playgrounds. Playgrounds
... 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
- Request a new feature. Open an Issue With Feature Request Template
... compare
... find compatible
- libraries from RxSwiftCommunity.
- Pods using RxSwift.
... 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
.throttle(0.3, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest { query -> Observable<[Repository]> in
if query.isEmpty {
return Observable.just([])
}
| |
| ... then bind the results to your tableview | |
searchResults
.bindTo(tableView.rx.items(cellIdentifier: "Cell")) {
(index, repository: Repository, cell) in
cell.textLabel?.text = repository.name
cell.detailTextLabel?.text = repository.url
}
.addDisposableTo(disposeBag) |
Requirements
-
Xcode 8.0 beta 6 (8S201h)
-
Swift 3.0
-
iOS 8.0+
-
Mac OS X 10.10+
-
tvOS 9.0+
-
watchOS 2.0+
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', '~> 3.0.0.alpha.1'
pod 'RxCocoa', '~> 3.0.0.alpha.1'
end
# RxTests and RxBlocking make the most sense in the context of unit/integration tests
target 'YOUR_TESTING_TARGET' do
pod 'RxBlocking', '~> 3.0.0.alpha.1'
pod 'RxTests', '~> 3.0.0.alpha.1'
end
Replace YOUR_TARGET_NAME and then, in the Podfile directory, type:
⚠️ If you want to use CocoaPods with Xcode 8.0 beta 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'
end
end
end
$ pod install
Carthage
Add this to Cartfile
github "ReactiveX/RxSwift" "3.0.0.alpha.1"
$ carthage update
Manually using git submodules
- Add RxSwift as a submodule
$ git submodule add git@github.com:ReactiveX/RxSwift.git
- Drag
Rx.xcodeprojinto Project Navigator - Go to
Project > Targets > Build Phases > Link Binary With Libraries, click+and selectRxSwift-[Platform]andRxCocoa-[Platform]targets
References
- http://reactivex.io/
- Reactive Extensions GitHub (GitHub)
- Erik Meijer (Wikipedia)
- Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)
- Reactive Programming Overview (Jafar Husain from Netflix)
- Subject/Observer is Dual to Iterator (paper)
- Rx standard sequence operators visualized (visualization tool)
- Haskell
