Created
October 22, 2018 02:37
-
-
Save sgr-ksmt/b0abb3b6817f790533b808acdff0c8ca to your computer and use it in GitHub Desktop.
RxPlayground demo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import RxSwift | |
import RxCocoa | |
import PlaygroundSupport | |
PlaygroundPage.current.needsIndefiniteExecution = true | |
// PublishRelay vs BehaviorRelay | |
do { | |
let relay = PublishRelay<Int>() | |
relay.accept(0) | |
// subscribeしてから値が流れてくる | |
_ = relay.subscribe(onNext: { print("PublishRelay", $0) }) | |
relay.accept(1) | |
relay.accept(2) | |
} | |
do { | |
let relay = BehaviorRelay<Int>(value: 0) | |
// subscribeした時に直近の値がすぐ流れてくる | |
_ = relay.subscribe(onNext: { print("BehaviorRelay", $0) }) | |
relay.accept(1) | |
relay.accept(2) | |
// `.value` で直近の値をすぐに取り出せる | |
print(relay.value) | |
} | |
// Signal vs Driver | |
do { | |
let relay = PublishRelay<Int>() | |
// PublishRelay → Signalはそのまま変換できる | |
let signal = relay.asSignal() | |
relay.accept(0) | |
// subscribeしてから値が流れてくる | |
_ = signal.emit(onNext: { print("Signal", $0) }) | |
relay.accept(1) | |
relay.accept(2) | |
} | |
do { | |
let relay = BehaviorRelay<Int>(value: 0) | |
let driver = relay.asDriver() | |
// subscribeした時に直近の値がすぐ流れてくる | |
_ = driver.drive(onNext: { print("Driver", $0) }) | |
relay.accept(1) | |
relay.accept(2) | |
} | |
// withLatestFrom | |
do { | |
class View { | |
let buttonDidTap = Observable.just(()) | |
let userID = BehaviorRelay<String>(value: "") | |
let requestAPITrigger = PublishRelay<String>() | |
let disposeBag = DisposeBag() | |
func run() { | |
buttonDidTap | |
.subscribe(onNext: { [weak self] in | |
guard let self = self else { return } | |
self.requestAPITrigger.accept(self.userID.value) | |
}) | |
.disposed(by: disposeBag) | |
} | |
} | |
class View2 { | |
let buttonDidTap = Observable.just(()) | |
let userID = BehaviorRelay<String>(value: "") | |
let requestAPITrigger = PublishRelay<String>() | |
let disposeBag = DisposeBag() | |
func run() { | |
buttonDidTap | |
.withLatestFrom(userID) | |
.bind(to: requestAPITrigger) | |
.disposed(by: disposeBag) | |
} | |
} | |
} | |
// zip | |
do { | |
let relay = PublishRelay<Int>() | |
_ = Observable | |
.zip(relay, relay.skip(1)) | |
.subscribe(onNext: { print("Before: \($0.0), After: \($0.1)")}) | |
relay.accept(1) | |
relay.accept(1) | |
relay.accept(2) | |
relay.accept(3) | |
relay.accept(5) | |
relay.accept(8) | |
} | |
// scan, startWith | |
do { | |
let disposeBag = DisposeBag() | |
let numbers = PublishRelay<[Int]>() | |
let relay = PublishRelay<[Int]>() | |
relay | |
.scan([], accumulator: { $0.isEmpty ? $1 : $0 + $1 }) | |
.startWith([]) | |
.bind(to: numbers) | |
.disposed(by: disposeBag) | |
_ = numbers.subscribe(onNext: { print("numbers", $0)}) | |
relay.accept([1, 2, 3]) | |
relay.accept([4, 5, 6]) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment