2017-02-24 4 views
1

버튼이 있고 버튼을 두 드릴 때마다 네트워크 요청을 수행하고 결과를 기본 스케줄러의보기에 바인딩하고 싶습니다. 또한이 네트워크 요청이 실패 할 가능성을 처리해야합니다. 여기에 내 원래의 아이디어 : 가능한 오류가 handleError에 의해 처리되고 다시 버튼을 탭하면 다시 요청을 할 수 있도록오류를 처리하지만 원본을 구독 유지 Observable

button.rx.tap.asObservable() 
    .flatMap(networkRequest) 
    .asDriver(onErrorRecover: handleError) 
    .drive(uiComponent) 
    .disposed(by: disposeBag) 

내가 일 할 것은. 오류가 발생하면 DriverhandleError이 (가) 반환됩니다. 내가 가지고있는 유일한 다른 생각은 신호를 Observable으로 유지하고 오류 케이스와 다음 케이스를 subscribe에 별도로 처리하는 것입니다. 또한 observeOn이 필요합니다. 나는 그보다 조금 더 우아한 것을 바라고 있었다. 누구든지이 사용 사례에 대한 대체 접근법을 가지고 있습니까?

나는 또한 우리를 위해 일했다 하나 개의 방법이 flatMap에서 오류를 처리하는 것이라고 언급해야 편집.

button.rx.tap.asObservable() 
    .flatMap { 
    return networkRequest() 
     .catchError(handleError) 
    } 
    .asDriver(onErrorDriveWith: Driver.empty()) 
    .drive(uiComponent) 
    .disposed(by: disposeBag) 

그러나 내가 생각하는 것보다 덜 우아합니다.

답변

0

반환 결과와 발생할 수있는 오류를 랩핑하려면 Result 유형을 사용합니다.

당신은 당신의 응답을 당신의 networkRequest() 방법 Result 유형

+0

감사를 변환 할 수 있습니다. 그러나 '결과'에서 오류를 래핑하면 '드라이버'로 변환하지 않고 '관찰 가능'구독시 '다음'및 '오류'이벤트를 다르게 처리하는 것과 동일한 효과 만 얻을 수 있다고 생각합니다. –

+1

네가 성취하고자하는 것을 알고 있지만 전에 시도했지만 좋은 해결책을 찾지 못했다. 나는 나에게 잘 보이는 '결과'방법으로 끝을 맺었다. 나는 우리 모두가 원하지만'슬픈 듯이이 연산자는'RxSwift'에서 사용할 수없는'onErrorResumeNext' 연산자가 있다고 믿습니다. –