0

일부 복잡한 데이터가있는 Android의 firebase를 사용하고 있습니다. 참조를 저장해야하고 우편 번호 작업이나 RX 전체를 처리하는 방식에 문제가 있습니다.stream1을 구독하는 .zip (stream1, stream2, BiFun)은 stream2가 stream1을 기반으로하는 경우 어떻게해야합니까?

특정 B에 대한 정보가있는 A object을 새로 만들고 B objectA에 대한 정보가 업데이트되도록하고 싶습니다. 중포 기지 작업이 모두 성공적이었다 때 나는 로그 캣을 통과 할 때 Single<A>

val singleA = firebaseCall(A("ABC", bKey)) 

val singleB = singleA.flatMap{ a -> firebaseCall(B(aKey)) } 

return Single.zip(singleA, singleB, BiFunction { a, b -> a }) 

내가 SingleA 두 번에 가입 얻을 수 있음을 알 수 반환하고, 중포 기지로 두 번 밀어 것입니다. 나는 이것을 피하고 싶다!

그래서 B가 A에 종속적 인 경우 A와 B에서 zip 함수를 어떻게 사용할 수 있습니까? A가 두 번 수행되지 않았습니까?

+0

왜 당신이 그들을 압축해야합니까? A로부터의 방출은 flatMapped가되고 그냥 B – elmorabea

+0

에 가입 할 수 있습니다. 메소드 서명은'Single '을 반환해야합니다. 그 이유는 – Yokich

+0

입니다. 두 경우 모두 배출원이 동일하기 때문에 이중 가입을하게됩니다. 이는 firebaseCall (A "ABC", bKey)), flat하지만 맵핑을 원한다면 flatMapped으로 매핑 한 다음지도 연산자를 사용하십시오. – elmorabea

답변

1

당신은 진짜로 이것에 대한 zip이 필요하지 않습니다 당신이 할 수있는 간단한지도 a 다시 :

val singleA = firebaseCall(A("ABC", bKey)) 

return singleA.flatMap{ a -> firebaseCall(B(aKey)).map { a } } 
+0

참, 멋진 해결책입니다. 나는 지금 당장 사용하고있는 것과 비슷한 것을했지만 교육적인 목적으로 사용했다. 왜 zip이'singleA' 구독을 두 번하게하고, 어떻게 피할 수 있습니까? – Yokich

+0

나는 약간의 연구를했는데'zip'이 두 소스에 모두 가입하고 그 마법을 사용하기 때문에 첫 번째 스트림이 두 번 구독하는 이유를 쉽게 설명 할 수 있습니다. 답변으로 표시하겠습니다. 깨끗한 해결책이되고있다. – Yokich