zip
관찰 가능한 소스 중 하나가 데이터를 방출 할 때 다른 관찰 가능 항목이 데이터를 방출 할 때까지 기다리지 않고 최근에 방출 된 데이터가있는 경우 가져 오기를 원합니다 .
obs1 --true-|->
obs2 --true-|->
obs3 --1-2-3-4->
zip은 TriFunction
with 매개 변수를 실행해야합니다.
true, true, 1
true, true, 2
true, true, 3
true, true, 4
내 질문이 이해되기를 바랍니다.
확장 된 질문
나는 이미 문제의 일부를 해결했고 여러분들에게 또 다른 문제가 있습니다. obs1
그리고 obs2
하나 방출합니다 비싼 작업이다 true
또는 false
. 내가 필요한 것은 모든 방출 obs3
에서 재실행해야 obs1
하거나 obs2
둘 중 하나가 false
이전 방출 에서 방출되는지 여부 입니다. 내가 위에 쓴 것은 최상의 경우 둘 다 obs1
과 obs2
를 방출 true
의 첫번째 방출에 obs3
.
-------1------------2-----------------3------------->
---true/false---true/re-execute---true/re-execute--->
---true/false---true/re-execute---true/re-execute--->
편집 는 "중" 확장 문제에 오해의 소지가있다.
내가 의미하는 것은 obs1
이전 방출에서 거짓 이면 obs1
. obs2
이전 방출에서 거짓 이면 obs2
. 둘 중 하나가이면 둘 다 다시 실행하지 마십시오 false
.
편집 : 확장 된 질문은 다른 연산자가 필요한 완전히 다른 문제입니다. 예를 들면 다음과 같습니다.
Observable<Boolean> obs1 = ...
Observable<Boolean> obs2 = ...
Observable<Integer> obs3 = ...
Function3<Integer, Boolean, Boolean> func = ...
// store last result of obs1 and obs2
boolean[] lastResults = { false, false };
// for each main value
obs3.concatMap(v -> {
// if any of the previous results were false
if (!lastResults[0] || !lastResults[1]) {
// run both obs1 and obs2 again
return Observable.zip(obs1, obs2, (a, b) -> {
// save their latest results
lastResult[0] = a;
lastResult[1] = b;
// apply the function to get the output
return func(v, a, b);
});
}
// otherwise call the function with true
return Observable.just(func.apply(v, true, true));
})
.subscribe(...);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다