Skip to content

Instantly share code, notes, and snippets.

@sgr-ksmt
Created October 22, 2018 02:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgr-ksmt/b0abb3b6817f790533b808acdff0c8ca to your computer and use it in GitHub Desktop.
Save sgr-ksmt/b0abb3b6817f790533b808acdff0c8ca to your computer and use it in GitHub Desktop.
RxPlayground demo
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