https://github.com/dankinsoid/rxoperators
Convenient operators for RxSwift
https://github.com/dankinsoid/rxoperators
Last synced: 10 months ago
JSON representation
Convenient operators for RxSwift
- Host: GitHub
- URL: https://github.com/dankinsoid/rxoperators
- Owner: dankinsoid
- License: mit
- Created: 2018-08-24T18:44:23.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2022-10-04T14:05:36.000Z (over 3 years ago)
- Last Synced: 2025-08-06T21:52:04.066Z (11 months ago)
- Language: Swift
- Homepage:
- Size: 170 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# RxOperators
[](https://travis-ci.org/Voidilov/RxOperators)
[](https://cocoapods.org/pods/RxOperators)
[](https://cocoapods.org/pods/RxOperators)
[](https://cocoapods.org/pods/RxOperators)
## Description
This repo includes operators for RxSwift and some additional features.
Example
```swift
import UIKit
import RxSwift
import RxCocoa
import RxOperators
final class SomeViewModel {
let title = ValueSubject("Title")
let icon = ValueSubject(nil)
let color = ValueSubject(UIColor.white)
let bool = ValueSubject(false)
...
}
class ViewController: UIViewController {
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var iconView: UIImageView!
@IBOutlet private weak var switchView: UISwitch!
let viewModel = SomeViewModel()
...
private func configureSubscriptions() {
viewModel.title ==> titleLabel.rx.text
viewModel.iconView ==> iconView.rx.image
viewModel.bool <==> switchView.rx.isOn
viewModel.color ==> (self, ViewController.setTint)
//or viewModel.color ==> rx.weak(method: ViewController.setTint)
//or viewModel.color ==> {[weak self] in self?.setTint(color: $0) }
}
private func setTint(color: UIColor) {
...
}
...
}
```
## Usage
1. Operator `=>`
- From `ObservableType` to `ObserverType`, creates a subscription and returns `Disposable`:
```swift
let disposable = intObservable => intObserver
```
- From `Disposable` to `DisposeBag`:
```swift
someDisposable => disposeBag
someObservable => someObserver => disposeBag
```
- From `ObservableType` to `SchedulerType`, returns `Observable`:
```swift
let scheduler = SerialDispatchQueueScheduler(internalSerialQueueName: "Scheduler")
someObservable => scheduler => someObserver => disposeBag
```
2. Operator `==>`
Drive `ObservableType` to `ObserverType` on main queue and returns `Disposable`:
```swift
intObservable ==> intObserver => disposeBag
```
3. Operators `<=>` and `<==>` create bidirectional subscriptions for `Equatable` sequences
4. Operator `=>>` replaces `.distinctUntilChanged()`
5. `DisposableObserverType` and `DisposableObservableType` - protocols for observer and observeables that dispose all subscriptions on deinit, so you don't have to control disposing for each subscription.
6. `ValueSubject` - analog of `Variable` with `DisposeBag` inside.
7. Some features:
- `skipNil()` operator
- `or(Bool), .toggle(), !` operators for boolean sequences
- use `+` and `+=` operator for merging observables, creating disposables, etc
- `interval(...)`
- `withLast() -> Observable<(previous: Element?, current: Element)>`
- `rx.asDisposeBag`
- `.mp` - `@dynamicMemberLookup` mapper
- `asResult() -> Observable>`
- `nilIfEmpty`
- `isEmpty`
- `isNil`
- `isNilOrEmpty`
- `wrap(...), guarantee(...)` static methods on Single to create Single from functions with completions
- `append(...)`
- `smooth(...)` methods to smooth changes, example: sequence`[0, 1]` turns to `[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]`
- `onNext, afterNext, onError, afterError, onCompleted, afterCompleted, onSubscribe, onSubscribed, onDispose` wrappers on `do(...)` operator
- `guard()`
- `rx.isFirstResponder`
- `UIStackView().rx.update(...)`
- `UIView().rx.transform.scale(), .rotation(), .translation()`
## Installation
1. [CocoaPods](https://cocoapods.org)
RxOperators is available through [CocoaPods](https://cocoapods.org). To install
it, simply add the following line to your Podfile:
```ruby
pod 'RxOperators'
```
and run `pod update` from the podfile directory first.
2. [Swift Package Manager](https://github.com/apple/swift-package-manager)
Create a `Package.swift` file.
```swift
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "SomeProject",
dependencies: [
.package(url: "https://github.com/dankinsoid/RxOperators.git", from: "2.11.0")
],
targets: [
.target(name: "SomeProject", dependencies: ["RxOperators"])
]
)
```
```ruby
$ swift build
```
## Author
Voidilov, voidilov@gmail.com
## License
RxOperators is available under the MIT license. See the LICENSE file for more info.