【Swift】RxSwift勉強してみたPart8

#はじめに
[前回](https://qiita.com/REON/items/dbceb1ce5a8977734352)
今回もRxSwiftを学習していく中での備忘録です。

#学んだこと
###イベントを流す
####単数
justで`Int->Observable<Int>`になっている。
1というイベントを流している。

```swift
let _ = Observable.just(1)
    .subscribe(onNext: { event in
        print(event)
    })
    .disposed(by: disposeBag)
// 1
```

####複数
fromを使って複数のイベントを流してObservableを生成

```swift
let _ = Observable.from([1, 2, 3])
    .subscribe(onNext: { event in
        print(event)
    })
    .disposed(by: disposeBag)
// 1
// 2
// 3
```

ofを使って引数で渡した要素が順に通知されるObservableを生成

```swift
let _ = Observable.of(1, 2, 3)
    .subscribe(onNext: { event in
        print(event)
    })
    .disposed(by: disposeBag)
// 1
// 2
// 3
```

ofとfromの違いは渡す引数がfromは配列でofは一つ一つ渡す。`of([1, 2, 3])`のようにすると`[1, 2, 3]`が出力される。


###任意の処理を行うObservableの生成

![スクリーンショット 2021-04-17 20.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/148a0dd3-51ba-da84-f20a-321ea053a5ce.png)

訳すと、Create演算子を用いてObservableを最初から生成できます。

```swift
let _ = Observable<Int>.create { observer in
    observer.onNext(1)
    observer.onNext(2)
    observer.onCompleted()
    observer.onNext(3)
    return Disposables.create()
}
.subscribe(onNext: { print($0) },
           onError: { print($0) },
           onCompleted: { print("onCompleted") },
           onDisposed: { print("onDisposed") }
)
.disposed(by: disposeBag)
// 1
// 2
// onCompleted
// onDisposed
```

###Subject

####PublishSubject
![スクリーンショット 2021-04-18 14.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/eabc49b9-0333-2e4f-1894-b25b32d29438.png)

サブスクライブした後にObservableによって発行されたものをオブザーバーに発行する。

```swift
let subject = PublishSubject<String>()
subject.onNext("1")
subject
    .subscribe(
        onNext: { string in
            print(string)
        }, onError: { error in
            print(error)
        }, onCompleted: {
            print("completed")
        }, onDisposed: {
            print("disposed")
        })
    .disposed(by: disposeBag)
subject.onNext("2")
subject.onNext("3")
subject.onCompleted()
subject.onNext("4")
// 2
// 3
// completed
// disposed
```

####BehaviorSubject
![スクリーンショット 2021-04-18 14.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/eb06b383-46b2-eed0-9f71-aaca50c74166.png)

サブスクライブした時点でオブザーバブルが最後に発行したものまたは、初期値を発行することから始まり、後に発行されたものを発行し続ける。

```swift
let subject = BehaviorSubject(value: "1")
subject.onNext("2")
subject
    .subscribe {
        print($0)
    } onError: { error in
        print("error")
    } onCompleted: {
        print("completed")
    } onDisposed: {
        print("disposed")
    }
    .disposed(by: disposeBag)
subject.onNext("3")
subject.onNext("4")
subject.onCompleted()
subject.onNext("5")
// 2
// 3
// 4
// completed
// disposed
```

####ReplaySubject

![スクリーンショット 2021-04-18 15.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/512ad241-72e6-0402-3991-bd8a0994c94f.png)

指定したbufferSizeだけの過去のeventを受け取れるSubject。

```swift
let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext("1")
subject.onNext("2")
subject.subscribe(onNext: {
    print("subscribe1 - " + $0)
})
.disposed(by: disposeBag)
subject.onNext("3")
subject.onNext("4")
subject.onNext("5")
subject.subscribe(onNext: {
    print("subscribe2 - " + $0)
})
.disposed(by: disposeBag)
subject.onNext("6")
// subscribe1 - 1
// subscribe1 - 2
// subscribe1 - 3
// subscribe1 - 4
// subscribe1 - 5
// subscribe2 - 4
// subscribe2 - 5
// subscribe1 - 6
// subscribe2 - 6
```

####BehaviorRelay
[参考](https://github.com/ReactiveX/RxSwift/blob/main/RxRelay/BehaviorRelay.swift)
nextイベントだけ流せる。nextイベントをながすにはacceptを使う。

```swift
let relay = BehaviorRelay(value: "1")
relay.accept("2")
relay.subscribe(onNext: {
    print($0)
})
.disposed(by: disposeBag)
relay.accept("3")
relay.accept("4")
// 2
// 3
// 4
```

```swift
let relay = BehaviorRelay(value: ["Item 1"])
var value = relay.value
value.append("Item 2")
value.append("Item 3")
relay.accept(value)
relay.subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
// ["Item 1", "Item 2", "Item 3"]
```

####PublishRelay
BehaviorRelayとPublishRelayの違い

||BehaviorRelay|PublishRelay|
|:--|:--:|:--:|
|next|○|○|
|error|×|×|
|complete|×|×|
|初期値|○|×|
|value|○|×|
|現在地を流す|○|×|


#おわりに
[次回](https://qiita.com/REON/items/08a19b644e2aac75eb83)
おわりです。