let numbers = (1...5).publisher
numbers
.prepend(100, 101)
.prepend(-1, -2)
.sink {
print($0)
}
// 출력값
-1
-2
100
101
1
2
3
4
5
prepend를 사용하면 output 앞에 특정 값 또는 publisher를 추가할 수 있다.
let numbers = (1...5).publisher
numbers
.append(100, 101)
.sink {
print($0)
}
// 출력값
1
2
3
4
5
100
101
prepend와는 반대로 output 뒤에 특정 값 또는 publisher를 추가할 수 있다.
let publisher1 = PassthroughSubject<String, Never>()
let publisher2 = PassthroughSubject<String, Never>()
let publishers = PassthroughSubject<PassthroughSubject<String, Never>, Never>()
publishers.switchToLatest().sink {
print($0)
}
publishers.send(publisher1)
publisher1.send("Publisher 1 - Value 1")
publisher1.send("Publisher 1 - Value 2")
publishers.send(publisher2)
publisher2.send("Publisher 2 - Value 1")
publisher1.send("Publisher 1 - Value 3")
// 출력값
Publisher 1 - Value 1
Publisher 1 - Value 2
Publisher 2 - Value 1
switchToLatest
는 가장 최근에 받은 publisher가 보낸 요소를 republish 한다.
출력값 예시를 보면 publishers에 publiser2가 가장 마지막으로 send 되었기 때문에 publisher1으로 send한 마지막 구문은 출력되지 않았다.
let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<Int, Never>()
publisher1.merge(with: publisher2)
.sink {
print($0)
}
publisher1.send(1)
publisher2.send(2)
publisher1.send(3)
// 출력값
1
2
3
4
merge
를 이용하면 서로 다른 두 publisher의 output을 합쳐서 한 구문에서 사용할 수 있다.
let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<String, Never>()
publisher1.combineLatest(publisher2)
.sink {
print($0)
}
publisher1.send(1)
publisher2.send("A")
publisher1.send(2)
publisher2.send("B")
// 출력값
(1, "A")
(2, "A")
(2, "B")
combineLatest
는 두 publisher를 이용하여 다른 한쪽의 가장 최근 output과 현재 받아온 output의 값을 결합시켜준다.
let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<String, Never>()
publisher1.zip(publisher2)
.sink {
print($0)
}
publisher1.send(1)
publisher2.send("A")
publisher1.send(2)
publisher2.send("B")
// 출력값
(1, "A")
(2, "B")
zip
은 combineLatest와 유사해보이지만 결과값은 매우 다르다.
두 publisher를 이용하여 다른 한쪽의 새로운 output이 발생할 때까지 기다린다. 즉, 값을 중복하여 사용하지 않고 두 publisher의 새로운 output을 담은 한 쌍의 투플을 반환한다.