Disposables
Disposablesとは?
これは
subscribe(onNext: ((Int) -> Void)?,
onError: ((Error) -> Void)?,
onCompleted:(() -> Void)?,
onDisposed: (() -> Void)?
)
前の投稿では、subscribeを呼び出す方法が2つあります.// # 1
Observable.from([1,2,3])
.subscribe { element in
print("Next",element)
} onError: { error in
print("Error",error)
} onCompleted: {
print("Completed")
} onDisposed: {
print("Disposed")
}
// # 2
Observable.from([1,2,3])
.subscribe{
print($0)
}
この2つのプログラムを実行すると、次の結果が出力されます.比較結果、
もしそうであれば、DispostedメソッドはObservableに関連するすべてのリソースが無効になった後に呼び出されますが、2はObservableに関連するすべてのリソースを無効にしていませんか?
とにかく#1と#2は解除されましたㅋㅋ
では疑問点です.
(観測可能な方法は、Next、Completed、Errorの3つ)
(#2にはこのような操作はないので、Dispostedメソッドは呼び出されていません.)
うん。なぜ1と2のように2つの方法があるのでしょうか。
恐らく.Observableがリソースを閉じるときに何かを実行したい場合は、
#1のように記入し、そうでない場合は#2のように記入すればよい.
ではDisposablesを知らなくてもいいですか?
質問(…)そうではありませんが、上ではそう言っていますよね?通常、Observableが終了すると(完了またはエラーイベントのため)、関連するすべてのリソースが自動的に無効になります.
ただし、完全またはエラーで終了しても、アップルの公式ドキュメントを表示します.
自動無効化ではなく、
Disposableは
では、どのようにしてリソースを解放し、実行をキャンセルしますか?
コードで表示します.
リソースを無効にします。
let subscription1 = Observable.from([1,2,3])
.subscribe { element in
print("Next",element)
} onError: { error in
print("Error",error)
} onCompleted: {
print("Completed")
} onDisposed: {
print("Disposed")
}
subscription1.dispose()
前述したように、dispose()メソッドを使用してリソースを無効にすることができます.しかし、公式文書はこのような方法で資源を解除することを提案していない.
なぜ元に戻すことを提案しないのかを振り返ってみましょう.
実行をキャンセルした場合
// #1
let subscription2 = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
.subscribe { element in
print("Next",element)
} onError: { error in
print("Error",error)
} onCompleted: {
print("Completed")
} onDisposed: {
print("Disposed")
}
// #2
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
subscription2.dispose()
}
+コードの簡単な説明:はい、何か問題がありますか.
結果を見てみましょう.
イベントは0->次の1->次の2->の表示順で発生します.
変なところがありますよね?
Observableが最後のイベントを処理すると、最後に呼び出されたCompletedは表示されません.
dispose()メソッドを使用してObserverableを強制閉鎖したため!
このように強制的に閉じる場合は、Completedを呼び出すことができないなどの問題のため、リソースを他の方法で閉じることをお勧めします.
DisposeBag
これです.DisposeBagを使用してリソースを解除する必要があります.
やってみましょう.
var bag = DisposeBag()
Observable.from([1,2,3])
.subscribe{
print($0)
}
.disposed(by: bag) // #1
bag = DisposeBag() // #2
では、DisposeBagのリソースをどのように無効にしますか?
簡単な方法は2つあります.
あるいは#2のように新しいDisposeBagを割り当てます.
最初から#2の変数をオプション変数にしてnilを入れればいいです.
このようなObservableによって転送されるイベントが終了した場合、すべてのリソースを無効にするために、上記の方法のDisposeBagを使用することをお勧めします.
うん.
書いているうちに長くなってしまうので、簡単に要約すると!
Observable.from([1,2,3])
.subscribe{
print($0)
}
.disposed(by: bag) // #1
Reference
この問題について(Disposables), 我々は、より多くの情報をここで見つけました https://velog.io/@tnddls2ek/Disposablesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol