Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active May 10, 2019 02:18
Show Gist options
  • Save KentarouKanno/71ecfecbcec4a7aed350ba7ce6290cbc to your computer and use it in GitHub Desktop.
Save KentarouKanno/71ecfecbcec4a7aed350ba7ce6290cbc to your computer and use it in GitHub Desktop.
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()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment