[RxSwift] Observable(2)


昨日はObserverableの作成と購読方法について議論しましたが、購読をキャンセルする方法について説明します.

観測可能終了

  • .dispose()dispose()を呼び出すことで、観測可能サブスクリプションをキャンセルすることができ、キャンセルするとイベント解放は発生しません.
  • let observable = Observable.of(1,2,3)
    
    let subscription = observable.subscribe({ (value) in
        print(value)
    })
    
    subscription.dispose()
    // next(1)
    // next(2)
    // next(3)
    // completed
    上記のコードでは、要素は(1,2,3)のみであるため、完了したイベントは解放されるが、要素が無限に多い場合はdispose()を呼び出す必要があるが、完了したイベントは解放される.
  • DisposeBag()
    1番と同じように購読をキャンセルすると、観測可能な数に応じてdispose()が行われるという問題があります.したがって,DisposedBag型を用いて管理すれば,より効率的に管理できる.バッグのようにObserverableをDisposedBagに入れます.
  • let observable = Observable.of(1,2,3)
    let disposeBag = DisposeBag()
    
    let subscription = observable.subscribe({ (value) in
        print(value)
    })
    .disposed(by: disposeBag)
    1つ目の例ではDisposeBag()メソッドを使用します.
  • .create(:).crete演算子を使用してObservableを作成することもできます.Observableがcompletedアクティビティを発行した場合、サブスクリプションは一時的に返されるとキャンセルされます.
  • let disposeBag = DisposeBag()
    
    Observable<Int>.create({ (observable) -> Disposable in
        observable.onNext(1)
        observable.onNext(2)
        observable.onNext(3)
        
        //observable.onCompleted()
        return Disposables.create()
        
    }).subscribe(onNext: { print($0) }, onError: { print($0) }, onCompleted: { print("completed") }, onDisposed: { print("disposed") }
    ).disposed(by: disposeBag)
    上記の例では、completedイベントのonCompleted()部分を注釈して実行すると、以下の結果が得られる.

    また、コメントを削除して実行すると、完全なイベントが解放され、disposabledが戻り、購読がキャンセルされます.

    ここで必ずしも完了したイベントではない場合、Observerableが完全に終了したerrorイベントでもエラーが発生すると、使い捨てが返されます.