Created
October 22, 2018 02:44
-
-
Save sgr-ksmt/81a1ba7073593163561589f32bd41e25 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
//: Playground - noun: a place where people can play | |
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: "xxxx") | |
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) | |
requestAPITrigger | |
.subscribe(onNext: { print($0)}) | |
.disposed(by: disposeBag) | |
} | |
} | |
class View2 { | |
let buttonDidTap = Observable.just(()) | |
let userID = BehaviorRelay<String>(value: "xxxx") | |
let requestAPITrigger = PublishRelay<String>() | |
let disposeBag = DisposeBag() | |
func run() { | |
buttonDidTap | |
.withLatestFrom(userID) | |
.bind(to: requestAPITrigger) | |
.disposed(by: disposeBag) | |
requestAPITrigger | |
.subscribe(onNext: { print($0)}) | |
.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