Swift4의 RxSwift를 사용하여 비동기 처리가 실패한 경우 재시도 여부를 확인한 후 다시 실행
비동기 처리 있습니다, 비동기 처리.
예를 들면 그것은 외부 통신이거나…
어쨌든!
외부 통신이나 어쨌든 실패하면 재시도 여부를 확인한 후 다시 확인하고 싶습니다! 라고 하는 일이 있다고 생각합니다.
RxSwift의 retryWhen을 사용하면 그런 처리도 깨끗이 깔끔하게 정리되어 버리므로 비망록도 겸해!
구현 예!
retry.swift// 何かしらの非同期処理を行う元ネタを用意
let o: Observable<Any> = Observable.create { observer in
    // とりあえずテスト用に毎回必ずエラーが起きるようにする
    observer.onError(TestError())
    return Disposables.create()
}
// retryWhenでリトライの条件を設定!
o.retryWhen({ (errors: Observable<Error>) in
    return errors.flatMap({ error -> Observable<Any> in
        let showAlert: Observable<Any> = Observable.create { observer in
            let action1 = UIAlertAction(title: "OK", style: .default, handler: { _ in
                // OKを押したら再実行!
                observer.onNext("🍛")
            })
            let action2 = UIAlertAction(title: "NG", style: .default, handler: { _ in
                // NGを押したらエラー実行でリトライ処理を抜ける!
                observer.onError(HogeError())
            })
            let alertController = UIAlertController(
                title: "", 
                message: "( ˘ω˘)", 
                preferredStyle: .alert
            )
            alertController.addAction(action1)
            alertController.addAction(action2)
            view.present(alertController, animated: true, completion: nil)
            return Disposables.create()
        }
        return showAlert
    })
}).subscribe(
    onNext: { _ in
        print("おめでとう👏")
    },
    onError: { _ in
        print("☠️")
    }
)
깨끗이 깨끗이 정리할 수 있다고 말하면서, 이마이치 기술이 중복인 생각도 하지만…
어쨌든 RxSwift에 재시도 처리를 맡기고 쓸 수있었습니다.
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(Swift4의 RxSwift를 사용하여 비동기 처리가 실패한 경우 재시도 여부를 확인한 후 다시 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/fumihiko-hidaka/items/c086f97f68711675afb0
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
// 何かしらの非同期処理を行う元ネタを用意
let o: Observable<Any> = Observable.create { observer in
    // とりあえずテスト用に毎回必ずエラーが起きるようにする
    observer.onError(TestError())
    return Disposables.create()
}
// retryWhenでリトライの条件を設定!
o.retryWhen({ (errors: Observable<Error>) in
    return errors.flatMap({ error -> Observable<Any> in
        let showAlert: Observable<Any> = Observable.create { observer in
            let action1 = UIAlertAction(title: "OK", style: .default, handler: { _ in
                // OKを押したら再実行!
                observer.onNext("🍛")
            })
            let action2 = UIAlertAction(title: "NG", style: .default, handler: { _ in
                // NGを押したらエラー実行でリトライ処理を抜ける!
                observer.onError(HogeError())
            })
            let alertController = UIAlertController(
                title: "", 
                message: "( ˘ω˘)", 
                preferredStyle: .alert
            )
            alertController.addAction(action1)
            alertController.addAction(action2)
            view.present(alertController, animated: true, completion: nil)
            return Disposables.create()
        }
        return showAlert
    })
}).subscribe(
    onNext: { _ in
        print("おめでとう👏")
    },
    onError: { _ in
        print("☠️")
    }
)
Reference
이 문제에 관하여(Swift4의 RxSwift를 사용하여 비동기 처리가 실패한 경우 재시도 여부를 확인한 후 다시 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fumihiko-hidaka/items/c086f97f68711675afb0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)