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가 쌍을 이룰 수 있게 값을 내지 않으면 발행되지 않아요.