Swift4의 RxSwift를 사용하여 비동기 처리가 실패한 경우 재시도 여부를 확인한 후 다시 실행

6390 단어 SwiftRxSwiftSwift4
오늘도 Swift4!

비동기 처리 있습니다, 비동기 처리.
예를 들면 그것은 외부 통신이거나…

어쨌든!
외부 통신이나 어쨌든 실패하면 재시도 여부를 확인한 후 다시 확인하고 싶습니다! 라고 하는 일이 있다고 생각합니다.
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에 재시도 처리를 맡기고 쓸 수있었습니다.

좋은 웹페이지 즐겨찾기