* commit 'f23eb75adc8aad2f4c5ae620da9cf3acd16cca12': Make Bool as KVORepresentable, to avoid ambiguty in observe() Fixes unit tests. Fixes delay operator. Adds timeout parameter to blocking observable sequence. patch the implement of convert to serial queue. implement all tests. Add real scheduler test. Use `SchedulerType.scheduleRecursive` and `CompositeDisposable.removeDisposable`. move lock on Error case. I'm sorry I fix mistype in _group.addDisposable argmunets. I think it was missed when rename tempolary field. update API.md add delay operator |
||
|---|---|---|
| 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
