0

나는 producerAproducerA이 오류가 발생하는 경우, 오류를 처리하고 거기서 멈추지 성공적으로도 실행되는 경우에만 실행해야 두 업체 A와 B producerB 있습니다. 그래서 나는 이와 같은 것을 시도했다. producerBproducerA이 오류가 발생하는 경우에도 실행처럼producerA가 오류를 발생시키지 않는 경우에만 producerB를 실행하는 방법은 무엇입니까? 나는 아래의 시나리오 와 함께 작동하도록 노력하고

producerA.flatMapError { 
    // handle error and stop right here 
}.then(producerB).startWithResult { 
    // ... 
} 

보인다. 내 시나리오에서 어떻게 작동시킬 수 있습니까?

+0

지도의 실행하지 않고 를 실패합니다/flatMap는 배열을 반환합니다. 오류를 반환하면 무엇을 의미합니까? – user1046037

답변

1

질문은 정확하게 "오류를 발생시키지 않습니다"라는 의미입니다. , 이벤트 후, 최종적으로하는 completed, failed 또는 interrupted 이벤트로 -

Signal/SignalProducer에 이벤트의 시퀀스는 precisely defined semantic

Value (X 0)에서의 임의의 수의 Theres 갖는다. 그 후에 더 이상의 사건은 없습니다.

일반적으로 당신은 가장 사업자는 value 이벤트에서 작동 즉시 (그들에 작동하지 않고) failed 이벤트를 전파 말할 수 있습니다. 특정 운영자가 확실하지 않은 경우 해당 운영자의 설명서에서 오류 이벤트의 동작에 대해 명확하게 살펴보십시오.


그래서 질문을 이해하는 한 가지 방법은 producerA이 (value 이벤트의 임의의 숫자 후) 성공적으로 완료 될 때 다음 producerB를 시작하고 producerAfailed 이벤트를 보내는 경우, 다음하지 않는, 말을하는 것입니다.

이 경우 then 연산자가 정확히 필요한 것입니다. producerA이 완료되는 즉시 producerB이 시작되지만 이 아닌이면 producerA이 실패합니다. 당신이이 그 (블록에 오류 처리가 어떻게 보이는지에 따라) 때문에 여기에 flatMapError를 사용 결국 producerB 발생하게 value 이벤트에 failed 이벤트를 변환 할 해달라고 것을

producerA.then(producerB) 
    .start(Signal.Observer(value: { value in 
    print("Value \(value)") 
    }, failed: {error in 
    print("Error \(error)") 
    })) 

참고. 질문을 이해하는 또 다른 방법


는 반환 producerA의 사건에 flatMap을 사용하는 것입니다 producerA 각 이벤트가 아닌 오류가이 경우 producerB 한 번

를 트리거해야 말을하는 것입니다 각 이벤트의 producerBproducerA입니다.여기에 참고, 다시, flatMap 즉시 failed 이벤트를 전파, 그래서 producerAfailed 이벤트는 전체 체인 producerB

producerA.flatMap(.concat) { _ in return producerB } 
    .start(Signal.Observer(value: { value in 
    print("Value \(value)") 
    }, failed: {error in 
    print("Error \(error)") 
    })) 
+1

좋은 답변입니다. 나는 그것에 대해 생각하는 좋은 방법은 'flatMapError'가 기본적으로 오류를 잡는 데 사용된다는 것입니다. 사실, [캐치라고 불리던] (https://github.com/ReactiveCocoa/ReactiveCocoa/commit/e0c266320ba160944eda894210ece7121216f174). 따라서 실제로 오류로 인해 신호 체인을 종료하려는 경우에는 사용하지 마십시오. 만약 당신이 오류로 종료 된 전체 체인을 원하지 않는다면, 'flatMapError' * after *'then. (producerB)'를 넣을 수 있습니다. – jjoelson

+0

@ MeXx 첫 번째 접근법에서 몇 가지 문제점을 발견했습니다. 첫 번째 생산자가 생산자 오류가 아니고 두 번째 생산자가 오류를 생성한다고 가정 해 봅시다. 값을 인쇄하고 결코 실패한 블록으로 이동하지 않습니다. – coolly

+0

@coolly, 'producerA'가 값을 전송 한 후 완료됩니까? 'producerB'는 일단 'producerA'가 완료되면 시작됩니다. 'producerA'가 값을 보낼 때'producerB'를 시작하려면'flatMap'과 함께 두 번째 접근법을 사용해야합니다. – jjoelson