0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Swift】RxSwift勉強してみたPart8

Last updated at Posted at 2021-04-17

#はじめに
前回
今回もRxSwiftを学習していく中での備忘録です。

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

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

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

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

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

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

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

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

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

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

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

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

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

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
参考
nextイベントだけ流せる。nextイベントをながすにはacceptを使う。

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
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 ×
現在地を流す ×

#おわりに
次回
おわりです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?