import UIKit
import RxSwift
import RxCocoa
final class ViewController: UIViewController {
@IBOutlet weak private var textField: UITextField!
@IBOutlet weak private var button: UIButton!
@IBOutlet weak private var button1: UIButton!
@IBOutlet weak private var label: UILabel!
@IBOutlet weak private var imageView: UIImageView!
@IBOutlet weak private var label1: UILabel!
@IBOutlet weak private var label2: UILabel!
@IBOutlet weak private var label3: UILabel!
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
buttonAction()
textFieldAction()
learning1()
learning2()
learning3()
learning4()
learning5()
learning6()
learning7()
learning8()
learning9()
learning10()
learning11()
learning12()
learning13()
learning14()
learning15()
learning16()
learning17()
learning18()
// learning19()
// learning20()
just()
range()
repeatElement()
generate()
error()
doMethod()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let v2 = segue.destination as? ViewController2 {
v2.view.backgroundColor = .orange
v2.buttonTap
.asObservable()
.subscribe(onNext: {
print("Back")
})
.disposed(by: disposeBag)
}
}
}
extension ViewController {
private func just() {
example("------- just ------") {
defer { print("--------------------") }
/* 最初に指定したnextが一度発生して、completeするObservable */
let just = Observable<Int>.just(1)
just
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
/*
onNext: 1
onCompleted:
onDisposed:
*/
}
}
extension ViewController {
private func range() {
example("------- range ------") {
defer { print("--------------------") }
/* count数分のeventを発生し、completeするObservable */
/* Observable<Int> */
let range = Observable.range(start: 1, count: 3)
range
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
/*
onNext: 1
onNext: 2
onNext: 3
onCompleted:
onDisposed:
*/
}
}
extension ViewController {
private func repeatElement() {
example("------- repeatElement ------") {
defer { print("--------------------") }
/* 指定した値のeventを無限に発生し続けるObservable、takeなどと一緒に使用 */
let repeatElement = Observable<Int>.repeatElement(5).take(3)
repeatElement
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
/*
onNext: 5
onNext: 5
onNext: 5
onCompleted:
onDisposed:
*/
}
}
extension ViewController {
private func generate() {
example("------- generate ------") {
defer { print("--------------------") }
let generate = Observable.generate(initialState: 0,
condition: { $0 < 3 },
iterate: { $0 + 1 })
generate
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
/*
onNext: 0
onNext: 1
onNext: 2
onCompleted:
onDisposed:
*/
}
}
struct MyError: Error {
}
extension ViewController {
private func error() {
example("------- error ------") {
defer { print("--------------------") }
/* 指定したerrorだけを発生させるObservable */
let error = Observable<Int>.error(MyError())
error
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
/*
MyError()
onDisposed:
*/
}
}
extension ViewController {
private func doMethod() {
example("------- do ------") {
defer { print("--------------------") }
let do1 = Observable<Int>.of(1, 2, 3).do (onNext: { print("do:", $0 + 1) })
do1
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
/*
do: 2
onNext: 1
do: 3
onNext: 2
do: 4
onNext: 3
onCompleted:
onDisposed:
*/
}
}
extension ViewController {
private func learning1() {
print("\n ----- learning1 -----")
let observable = Observable.of(
"R",
"Rx",
"RxS",
"RxSw",
"RxSwi",
"RxSwif",
"RxSwift"
)
_ = observable
.subscribe(onNext: {
print("onNext:", $0)
}, onCompleted: {
print("onCompleted!")
})
/* Log
onNext: R
onNext: Rx
onNext: RxS
onNext: RxSw
onNext: RxSwi
onNext: RxSwif
onNext: RxSwift
onCompleted!
*/
}
}
extension ViewController {
private func learning2() {
print("\n ----- learning2 -----")
let observable = Observable.of(
"R",
"Rx",
"RxS",
"RxSw",
"RxSwi",
"RxSwif",
"RxSwift"
)
_ = observable
.filter { $0.count >= 2 } /* 2文字以上 */
.subscribe(onNext: {
print("onNext:", $0)
}, onCompleted: {
print("onCompleted!")
})
/* Log
onNext: Rx
onNext: RxS
onNext: RxSw
onNext: RxSwi
onNext: RxSwif
onNext: RxSwift
onCompleted!
*/
}
}
extension ViewController {
private func learning3() {
print("\n ----- learning3 -----")
let observable = Observable.of(
"R",
"Rx",
"RxS",
"RxSw",
"RxSwi",
"RxSwif",
"RxSwift"
)
_ = observable
.filter { $0.count >= 2 } /* 2文字以上 */
.map { $0.lowercased() } /* lowercased */
.subscribe(onNext: {
print("onNext:", $0)
}, onCompleted: {
print("onCompleted!")
})
/* Log
onNext: rx
onNext: rxs
onNext: rxsw
onNext: rxswi
onNext: rxswif
onNext: rxswift
onCompleted!
*/
}
}
extension ViewController {
private func learning4() {
print("\n ----- learning4 -----")
print("----- publishSubject -----")
/* 初期値なし onNext, onError, onCompleted */
let publishSubject = PublishSubject<Int>()
/* Observable */
publishSubject
.subscribe(onNext: { value in
print(value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted")
}).disposed(by: disposeBag)
/* Observer */
publishSubject.onNext(1)
print("----- BehaviorSubject -----")
/* 初期値あり onNext, onError, onCompleted */
let behaviorSubject = BehaviorSubject<Int>(value: 2)
/* Observable */
behaviorSubject
.subscribe(onNext: { value in
print(value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted")
}).disposed(by: disposeBag)
/* Observer */
behaviorSubject.onNext(3)
/* 3 */
let value = try? behaviorSubject.value()
print(value ?? 0)
print("----- PublishRelay -----")
/* 初期値なし onNext */
let publishRelay = PublishRelay<Int>()
/* Observable */
publishRelay
.subscribe(onNext: { value in
print(value)
})
.disposed(by: disposeBag)
publishRelay.accept(4)
print("----- BehaviorRelay -----")
/* 初期値あり onNext */
let behaviorRelay = BehaviorRelay<Int>(value: 5)
/* valueへのアクセスができる 5 */
behaviorRelay.value
behaviorRelay
.subscribe(onNext: { value in
print(value)
})
.disposed(by: disposeBag)
print("----- Observable<Int> -----")
/* onNext, onError, onCompleted */
let observableJust = Observable<Int>.just(6)
observableJust
.subscribeOn(MainScheduler.instance) /* Mainthread */
.subscribe(onNext: { value in
print(value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted")
}).disposed(by: disposeBag)
observableJust
.subscribe(onNext: { value in
print(value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted")
}).disposed(by: disposeBag)
print("----- Observable<Int> -----")
/* onNext, onError, onCompleted */
/* Observable<Int> */
let observableOf = Observable<Int>.of(7)
/* Observable<Int> */
let observableOf1 = Observable.of(7)
/* Observable<[Int]> */
let observableOf2 = Observable.of([7])
/* 以下の2つは同じ挙動 */
let observableOf3 = Observable.of(1, 2, 3)
let observableFrom1 = Observable.from([1, 2, 3])
observableOf
.subscribe(onNext: { value in
print(value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted")
}).disposed(by: disposeBag)
print("----- Observable<Int> -----")
let observableFrom = Observable.from([1, 2, 3])
observableFrom
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print(error)
}, onCompleted: {
print("onCompleted")
})
.disposed(by: disposeBag)
print("----- Driver<Int> -----")
// DriverはMainScheduler.instanceでdrive, subscribe, bindのメソッドが実行されます。
/* SharedSequence<DriverSharingStrategy, Int> */
let driverJust = Driver<Int>.just(8)
driverJust
.drive(onNext: { value in
print(value)
}, onCompleted: {
print("onCompleted")
})
.disposed(by: disposeBag)
print("----- Driver<Int> -----")
/* SharedSequence<DriverSharingStrategy, Int> */
let driverOf = Driver<Int>.of(9)
driverOf
.drive(onNext: { value in
print(value)
}, onCompleted: {
print("onCompleted")
})
.disposed(by: disposeBag)
print("----- Single<Int> -----")
/* PrimitiveSequence<SingleTrait, Void> */
/* onSuccess: は 1回だけ流れる onNext: */
/* onSuccess, onError */
let singleJust = Single<Int>.just(10)
singleJust
.subscribe(onSuccess: { value in
print(value)
}, onError: { error in
print(error)
})
.disposed(by: disposeBag)
print("----- Completable -----")
let completable = Completable.error(NSError(domain: "Domain", code: 111, userInfo: nil))
completable
.subscribe(onCompleted: {
print("onCompleted:")
}, onError: { error in
print(Thread.isMainThread)
print("onError:", error)
})
.disposed(by: disposeBag)
print("----- Maybe<Int> -----")
/* PrimitiveSequence<SingleTrait, Void> */
/* onSuccess: は 1回だけ流れる onNext: */
/* onSuccess:, onError:, onCompleted: */
let maybeJust: Maybe<Int> = .just(11)
maybeJust
.subscribe(onSuccess: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted:")
}).disposed(by: disposeBag)
// .subscribe(onSuccess: { value in
// print("onNext:", value)
// }, onError: { error in
// print("onError:", error)
// }, onCompleted: {
// print("onCompleted:")
// }, onDisposed: {
// print("onDisposed:")
// })
// .disposed(by: disposeBag)
print("-----------------------")
// let binder = Binder<Int>.self
//
// self.rx.count.onNext(0)
// self.rx.count.onNext(2)
}
}
extension ViewController {
private func buttonAction() {
button.rx.tap
.subscribe(onNext: {
print("Tap --- 1")
})
.disposed(by: disposeBag)
button.rx.tap
.subscribe { _ in
print("Tap --- 2")
}
.disposed(by: disposeBag)
button.rx.tap
.subscribe { _ in
print("Tap --- 3")
}
.disposed(by: disposeBag)
/* */
let buttonTapObservable = button.rx.tap.share(replay: 1)
buttonTapObservable
.subscribe { _ in
print("Tap --- 4")
}
.disposed(by: disposeBag)
buttonTapObservable
.subscribe { _ in
print("Tap --- 5")
}
.disposed(by: disposeBag)
Observable<Int>
.never()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
/* Reactive<UIButton> */
let reactiveButton = button.rx
/* ControlEvent<Void> */
let controlEvent = button.rx.tap
/* Observable<Void> */
let observable = button.rx.tap.asObservable()
observable
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted:")
})
.disposed(by: disposeBag)
/* SharedSequence<DriverSharingStrategy, Void> */
let driver = button.rx.tap.asDriver()
driver
.drive(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
})
.disposed(by: disposeBag)
let oo = driver
.do(onNext: { value in
print(value)
}, onCompleted: {
}, onSubscribe: {
}, onSubscribed: {
})
/* PrimitiveSequence<MaybeTrait, Void> */
/* onSuccess: は 1回だけ流れる onNext: (onCompleted: のみ流れてくる可能性があり) */
let maybe = button.rx.tap.asMaybe()
maybe
.subscribe(onSuccess: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted:")
})
.disposed(by: disposeBag)
/* PrimitiveSequence<SingleTrait, Void> */
/* onSuccess: は 1回だけ流れる onNext: */
let single = button.rx.tap.asSingle()
single
.subscribe(onSuccess: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
})
.disposed(by: disposeBag)
/* SharedSequence<SignalSharingStrategy, Void> */
let signal = button.rx.tap.asSignal()
signal
.emit(onNext: { value in
print("onNext: ", value)
}, onCompleted: {
print("onCompleted:")
})
.disposed(by: disposeBag)
/* Disposable */
let Disposable = button.rx.tap.subscribe()
/* () */
let void = button.rx.tap.subscribe().disposed(by: disposeBag)
let driverEmpty = Driver<String>.empty()
}
}
extension ViewController {
private func learning5() {
print("----- Create -----")
Observable<Int>.create { observer -> Disposable in
observer.onNext(10)
observer.onNext(11)
observer.onNext(12)
observer.onCompleted()
return Disposables.create()
}.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted")
})
.disposed(by: disposeBag)
}
}
extension ViewController {
private func learning6() {
print("----- Share -----")
/*
let textObservable = textField.rx.text
.orEmpty
.map { text -> String in
print("Call")
return "☆☆\(text)☆☆"
}
textObservable
.bind(to: label1.rx.text)
.disposed(by: disposeBag)
textObservable
.bind(to: label2.rx.text)
.disposed(by: disposeBag)
textObservable
.bind(to: label3.rx.text)
.disposed(by: disposeBag)
*/
/*
/* Driverに変換してshareにする方法 */
let textObservable = textField.rx.text
.asDriver()
.map { text -> String in
print("Driver - Call")
return "☆☆\(text!)☆☆"
}
textObservable
.drive(label1.rx.text)
.disposed(by: disposeBag)
textObservable
.drive(label2.rx.text)
.disposed(by: disposeBag)
textObservable
.drive(label3.rx.text)
.disposed(by: disposeBag)
*/
/* shareを使用する */
let textObservable = textField.rx.text
.orEmpty
.map { text -> String in
print("Call")
return "☆☆\(text)☆☆"
}
.share(replay: 1)
textObservable
.bind(to: label1.rx.text)
.disposed(by: disposeBag)
textObservable
.bind(to: label2.rx.text)
.disposed(by: disposeBag)
textObservable
.bind(to: label3.rx.text)
.disposed(by: disposeBag)
}
}
extension ViewController {
private func learning7() {
Observable
.of(
button1.rx.controlEvent(.touchDown).map { true },
button1.rx.controlEvent(.touchUpInside).map { false },
button1.rx.controlEvent(.touchCancel).map { false }
)
.merge()
.map { CGFloat($0 ? 0.4 : 1.0) }
.observeOn(MainScheduler.instance)
.bind(to: label2.rx.alpha)
.disposed(by: disposeBag)
}
}
extension ViewController {
private func learning8() {
example("--- learning8() ---") {
let one = 1
let two = 2
let three = 3
let observable = Observable.of(one, two, three)
observable.subscribe({ event in
print(event)
})
.disposed(by: disposeBag)
}
/*
next(1)
next(2)
next(3)
completed
*/
}
}
extension ViewController {
private func learning9() {
example("--- learning9() Empty ---") {
/* completeだけが発生するObservable。 */
let empty1 = Observable<Void>.empty()
empty1.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted:")
})
.disposed(by: disposeBag)
let empty2 = Observable<String>.empty()
empty2.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted:")
})
.disposed(by: disposeBag)
let empty3 = Observable<Int>.empty()
empty3.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted:")
})
.disposed(by: disposeBag)
/*
onCompleted:
onCompleted:
onCompleted:
*/
}
}
}
extension ViewController {
private func learning10() {
example("--- learning10() ---") {
/* Observable Create → dispose() */
let observable = Observable<Int>.create({ observable -> Disposable in
return Disposables.create()
})
let o = observable
.subscribe(onNext: { value in
print("onNext:", value)
}, onError: { error in
print("onError:", error)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
o.dispose()
print("--------------------")
/*
"onDisposed:"
*/
}
}
}
extension ViewController {
private func learning11() {
/* */
example("--- learning11() ---") {
defer { print("--------------------") }
/* Observable → Driver */
/* エラーが発生時に指定した Driver のイベントを通知する */
let observable1 = Observable<Int>.just(1)
observable1
.asDriver(onErrorDriveWith: Driver.empty())
.drive(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
/* 次にエラーが発生したら指定した値を通知する */
let observable2 = Observable<Int>.just(2)
observable2
.asDriver(onErrorJustReturn: 0)
.drive(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
/* エラー内容に応じて処理を切り替えられる */
let observable3 = Observable<Int>.just(3)
observable3
.asDriver(onErrorRecover: { error -> SharedSequence<DriverSharingStrategy, Int> in
return Driver.just(0)
})
.drive(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
}
}
extension ViewController {
private func learning12() {
/* distinctUntilChanged */
example("--- learning12() distinctUntilChanged ---") {
defer { print("--------------------") }
let observable = Observable<Int>.create({ observable -> Disposable in
observable.onNext(1)
observable.onNext(1)
observable.onNext(2)
observable.onNext(3)
observable.onNext(3)
observable.onCompleted()
return Disposables.create()
})
observable
.distinctUntilChanged { $0 == $1 }
.subscribe(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
observable
.distinctUntilChanged() /* Equatable */
.subscribe(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
}
}
}
extension ViewController {
private func learning13() {
example("--- learning13() Image Bind ---") {
defer { print("--------------------") }
let imageSubject = PublishSubject<UIImage>()
imageSubject
.bind(to: imageView.rx.image)
.disposed(by: disposeBag)
button1.rx.tap.subscribe(onNext: { tap in
imageSubject.onNext(UIImage(named: "m")!)
})
.disposed(by: disposeBag)
/*
--- learning13() Image Bind ---
--------------------
*/
}
}
}
extension ViewController {
private func learning14() {
example("--- learning14() Signal ---") {
defer { print("--------------------") }
let publishRelay = PublishRelay<Int>()
let signal = publishRelay.asSignal()
publishRelay.accept(1)
publishRelay.accept(2)
signal
.emit(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
publishRelay.accept(3)
/*
--- learning14() Signal ---
onNext: 3
--------------------
*/
}
}
}
extension ViewController {
private func learning15() {
example("--- learning15() BehaviorRelay ---") {
defer { print("--------------------") }
let behaviorRelay = BehaviorRelay<Int>(value: 1)
let signal = behaviorRelay.asSignal(onErrorJustReturn: 2)
behaviorRelay.accept(3)
signal
.emit(onNext: { value in
print("onNext:", value)
}, onCompleted: {
print("onCompleted:")
}, onDisposed: {
print("onDisposed:")
})
.disposed(by: disposeBag)
behaviorRelay.accept(4)
/*
--- learning15() BehaviorRelay ---
onNext: 3
onNext: 4
--------------------
*/
}
}
}
extension ViewController {
private func learning16() {
example("--- learning16() ---") {
defer { print("--------------------") }
// doをかませてログを見る
let doObservable = Observable.of(0, 1, 2, 3).do(onNext: { print($0) })
doObservable
.subscribe({ event in
print("Event", event)
})
.disposed(by: disposeBag)
}
}
}
extension ViewController {
private func learning17() {
example("--- learning17() ---") {
defer { print("--------------------") }
let publishSubject = PublishSubject<Int>()
publishSubject.asObservable().subscribe { (event) in
print("publishSubject: 1, event:\(event)")
}.disposed(by: disposeBag)
publishSubject.onNext(1)
publishSubject.onNext(2)
publishSubject.asObservable().subscribe { (event) in
print("publishSubject: 2, event:\(event)")
}.disposed(by: disposeBag)
publishSubject.onNext(3)
publishSubject.onNext(4)
publishSubject.onCompleted()
}
/*
--- learning17() ---
publishSubject: 1, event:next(1)
publishSubject: 1, event:next(2)
publishSubject: 1, event:next(3)
publishSubject: 2, event:next(3)
publishSubject: 1, event:next(4)
publishSubject: 2, event:next(4)
publishSubject: 1, event:completed
publishSubject: 2, event:completed
--------------------
*/
}
}
extension ViewController {
private func learning18() {
example("--- learning18() ReplaySubject ---") {
defer { print("--------------------") }
let replaySubject = ReplaySubject<Int>.create(bufferSize: 2)
replaySubject.asObservable().subscribe { (event) in
print("replaySubject: 1, event:\(event)")
}.disposed(by: disposeBag)
replaySubject.onNext(1)
replaySubject.onNext(2)
replaySubject.onNext(3)
replaySubject.onNext(4)
replaySubject.asObservable().subscribe { (event) in
print("replaySubject: 2, event:\(event)")
}.disposed(by: disposeBag)
replaySubject.onNext(5)
replaySubject.onNext(6)
replaySubject.onCompleted()
}
/*
--- learning18() ---
replaySubject: 1, event:next(1)
replaySubject: 1, event:next(2)
replaySubject: 1, event:next(3)
replaySubject: 1, event:next(4)
replaySubject: 2, event:next(3)
replaySubject: 2, event:next(4)
replaySubject: 1, event:next(5)
replaySubject: 2, event:next(5)
replaySubject: 1, event:next(6)
replaySubject: 2, event:next(6)
replaySubject: 1, event:completed
replaySubject: 2, event:completed
--------------------
*/
}
}
extension ViewController {
private func textFieldAction() {
textField.rx.text
.orEmpty
.asObservable()
.bind(to: self.label.rx.text)
.disposed(by: disposeBag)
}
}
extension Reactive where Base: UIViewController {
var count: Binder<Int> {
return Binder(self.base) { _, count in
if count > 0 {
print("over 1")
} else {
print("equal 0")
}
}
}
}
// RxSwiftにおけるマルチスレッドの理解を深める — Schedulerについて
// https://medium.com/eureka-engineering/rxswiftにおけるマルチスレッドの理解を深める-schedulerについて-2471ec76e518
// RxSwift.Driver についての個人的見解
// https://qiita.com/inamiy/items/d6fa90d0401fa0e83852
// 【RxSwift】Subjectまとめ
// http://y-hryk.hatenablog.com/entry/2018/08/02/115834
public func example(_ description: String, action: () -> Void) {
print(description)
action()
}
Last active
May 10, 2019 02:18
-
-
Save KentarouKanno/71ecfecbcec4a7aed350ba7ce6290cbc to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment