ErrorHandling in RxSwift
3419 ワード
Error Handling
SWIFTやRxSWIFTを学んだ人は、C/C+、JAVA、Python、JSなど他の言語を先に学んだ人がほとんどです.私が今話していることを大体見積もってみます.
これから発表されるError HandlingはJAVAやPythonなどで使われるTry Catchで、Error Handlingと似たようなことについて議論します.
RxSWIFTでエラーを処理する方法
通常、Observableによって渡されたエラー・イベントがサブスクライバに渡されると、サブスクライバは停止し、サブスクライバはObservableから新しいイベントを受信できなくなります.
つまり、新しい事件を処理することはできません.
観測可能なものから.onNextイベントの開始時にUIを更新することを想像してみてください.
Errorイベントがサブスクライバに転送されると、この可視性はサブスクライバを停止し、ユーザーインタフェースは更新できなくなります.
つまり,
エラー処理方法は2種類あります.
1.RxSwiftでエラーイベントを送信した場合、新たな観測可能な
Operatorはcatch Errorを使用します.ソースがError Eventによって殺されても、死後に戻って観測可能な新しい観測可能なものになります.onNext, .onCompletedアクティビティはサブスクライバに再送信されます.
また、catch ErrorJustReturnを使用すると、ソースのデータ型に応じて、Errorが発生したときにパラメータがサブスクライバに渡されます.コードは次のとおりです.
let bag = DisposeBag()
enum ERR: Error {
case error
}
let subject = PublishSubject<String>()
subject
.catchErrorJustReturn("Hello")
.subscribe { print($0) }
.disposed(by: bag)
subject.onError(ERR.error)
様々な分野で使用できるが、死後は致命的な購読者ネットワークで使用する方法が多い.2.再購読エラー発生時の問題の観測可能性
OperatorとしてRetry()を使用します.Observableでエラーが発生した場合は、購読をキャンセルして新しい購読を開始します.
新しいサブスクリプションが開始されるにつれて、観測可能なシーケンスは最初から開始されます.
簡単に言えば、Observableにエラーが発生していない場合は正常に動作し、エラーが発生した場合は新しいソースを再作成して購読します.
次に、前述した再試行の使用方法についてお話しします.
再試行()は
上の図と同じ定義があります.
このコードを読めばわかるかもしれませんが、これは大きな問題があります.
再試行()方式は,誤りが発生するまで観測可能な挙動を繰り返す.retryで他のパラメータがない形式を使用している場合は、リソースの浪費に相当するErrorを無限に表示し続け、コンピュータアーキテクチャにどのような影響を及ぼすかは後でわかりません.非常に致命的なエラーが発生する可能性があるので、retry()でパラメータを使用しないで使用しないでください.
またretryでは、パラメータに数字を付けることができます.
たとえば、retry(7)を入れると、7回の再試行は行われません.最初のカウントを厳密に統合して実行します.
私たちが学んだこのRxSWIFTをアプリケーションの開発に使用します.このとき、私たちが考えることができる動作は、ディスプレイに表示されているボタンを押す場合です.
このような場合、「ユーザが再試行ボタンを押したときにのみ再試行を行うとしたらどうなるか」という状況になる可能性があります.という質問です.
また、この場合、retryWhenという適切な操作が使用できます.
イベントをトリガ・トピックに転送すると、Source Observerableで新しいサブスクリプションが開始されたかどうかも判断できます.
コードから見ると、以下のようになります.
var attempts = 1
let source = Observable<Int>.create { observer in
let currentAttempts = attempts
print("START #\(currentAttempts)")
if attempts < 3 {
observer.onError(MyError.error)
attempts += 1
}
observer.onNext(1)
observer.onNext(2)
observer.onCompleted()
return Disposables.create {
print("END #\(currentAttempts)")
}
}
let trigger = PublishSubject<Void>()
source
.retryWhen {
_ in trigger
}
.subscribe { print($0) }
.disposed(by: bag)
エラー処理完了後
非動機はいつもどのようにエラーを処理しますか?
ここでは,以前WebやEmbedded Systemで用いられていた方法との違い,およびSWIFTとして開発されたアプリケーションの安定性について考える時間がある.
最近会社で時間がかかりすぎて勉強する時間が足りないのですが、やはり自分との約束を守って、1日に1つしか発表しません.
嗄嗄
Reference
この問題について(ErrorHandling in RxSwift), 我々は、より多くの情報をここで見つけました https://velog.io/@hzw94/ErrorHandling-in-RxSwiftテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol