RxOperators
Description
This repo includes operators for RxSwift and some additional features.
Example
import UIKit
import RxSwift
import RxCocoa
import RxOperators
final class SomeViewModel {
let title = ValueSubject("Title")
let icon = ValueSubject<UIImage?>(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
- Operator
=>
- From
ObservableTypetoObserverType, creates a subscription and returnsDisposable:
let disposable = intObservable => intObserver- From
DisposabletoDisposeBag:
someDisposable => disposeBag
someObservable => someObserver => disposeBag- From
ObservableTypetoSchedulerType, returnsObservable<E>:
let scheduler = SerialDispatchQueueScheduler(internalSerialQueueName: "Scheduler")
someObservable => scheduler => someObserver => disposeBag- Operator
==>
Drive ObservableType to ObserverType on main queue and returns Disposable:
intObservable ==> intObserver => disposeBag-
Operators
<=>and<==>create bidirectional subscriptions forEquatablesequences -
Operator
=>>replaces.distinctUntilChanged() -
DisposableObserverTypeandDisposableObservableType- protocols for observer and observeables that dispose all subscriptions on deinit, so you don't have to control disposing for each subscription. -
ValueSubject<Element>- analog ofVariable<Element>withDisposeBaginside. -
Some features:
skipNil()operatoror(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-@dynamicMemberLookupmapperasResult() -> Observable<Result<Element, Error>>nilIfEmptyisEmptyisNilisNilOrEmptywrap(...), guarantee(...)static methods on Single to create Single from functions with completionsappend(...)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, onDisposewrappers ondo(...)operatorguard()rx.isFirstResponderUIStackView().rx.update(...)UIView().rx.transform.scale(), .rotation(), .translation()
Installation
RxOperators is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'RxOperators'and run pod update from the podfile directory first.
Create a Package.swift file.
// 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"])
]
)$ swift buildAuthor
Voidilov, [email protected]
License
RxOperators is available under the MIT license. See the LICENSE file for more info.