zip은 두 개 이상의 Publisher를 조합하여 각 Publisher에서 발행되는 값을 쌍으로 묶는데에 사용돼요.
let publisher1 = PassthroughSubject<String, Never>()
let publisher2 = PassthroughSubject<String, Never>()
let publisher3 = PassthroughSubject<String, Never>()
Publishers.Zip3(publisher1, publisher2, publisher3)
.sink { (pubValue1, pubValue2, pubValue3) in
print("\\(pubValue1), \\(pubValue2), \\(pubValue3)")
}
.store(in: &cancellables)
publisher1.send("1")
publisher2.send("2")
publisher3.send("3")
// 결과
1, 2, 3
⚠️ 만약 여기서 한개의 publisher라도 값을 발행하지 않으면 발행되지 않아요.
let publisher1 = PassthroughSubject<String, Never>()
let publisher2 = PassthroughSubject<String, Never>()
let publisher3 = PassthroughSubject<String, Never>()
Publishers.Zip3(publisher1, publisher2, publisher3)
.sink { (pubValue1, pubValue2, pubValue3) in
print("\\(pubValue1), \\(pubValue2), \\(pubValue3)")
}
.store(in: &cancellables)
publisher1.send("1")
publisher2.send("2")
//publisher3.send("3")
// 결과
(결과없음)
⚠️ 쌍을 이루지 않는 publisher의 값 역시 발행되지 않아요.
let publisher1 = PassthroughSubject<String, Never>()
let publisher2 = PassthroughSubject<String, Never>()
let publisher3 = PassthroughSubject<String, Never>()
Publishers.Zip3(publisher1, publisher2, publisher3)
.sink { (pubValue1, pubValue2, pubValue3) in
print("\\(pubValue1), \\(pubValue2), \\(pubValue3)")
}
.store(in: &cancellables)
publisher1.send("1")
publisher2.send("2")
publisher3.send("3")
publisher1.send("4")
// 결과
1, 2, 3
publisher1,2,3에서 발행한 값들은 정상 발행시 소진되기 때문에
publisher1에서 새로발행한 4는 다른 publisher가 쌍을 이룰 수 있게 값을 내지 않으면 발행되지 않아요.