Combining Operator
Combine에서 Operator는 Publisher를 가공해 다른 형태나 구성으로 변경해주는 역할을 한다. Upstream으로부터 전달받은 데이터를 가공하여 downstream으로 전달하는 것이다.
그 중 데이터를 추가 혹은 합성하는 Operator(Combining Operator)를 정리해볼까 한다.
prepend
Example
let numbers = (1...5).publisher
let publisher2 = (500...510).publisher
numbers.prepend(100,101)
.prepend(-1,-2)
.prepend([45,67])
.prepend(publisher2)
.sink {
print($0)
}
Output
500
501
502
503
504
505
506
507
508
509
510
45
67
-1
-2
100
101
1
2
3
4
5
- 데이터의 앞에 새로운 데이터를 추가할 수 있다.
- publisher 자체를 추가할 수도 있다.
append
Example
let numbers = (1...10).publisher
let publisher = (100...110).publisher
numbers.append(11,12)
.append(13,14)
.append(publisher)
.sink {
print($0)
}
Output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
100
101
102
103
104
105
106
107
108
109
110
- 데이터의 뒤에 새로운 데이터를 추가할 수 있다.
- publisher 자체를 추가할 수도 있다.
switchToLatest
Example
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")
Output
Publisher 1 - Value 1
Publisher 1 - Value 2
Publisher 2 - Value 1
- publisher가 publisher를 방출하는 상황에서, 내부 publisher의 Output을 방출하도록 한다.
- 버퍼가 없기 때문에 가장 마지막에 등록된 publisher만 처리된다.
combineLatest
Example
let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<String,Never>()
publisher1.combineLatest(publisher2)
.sink {
print("P1: \($0), P2: \($1)")
}
publisher1.send(1)
publisher2.send("A")
publisher2.send("B")
Output
P1: 1, P2: A
P1: 1, P2: B
- 두 publisher는 서로의 마지막 데이터와 결합하여 데이터를 반환하도록 한다.
zip
Example
let publisher1 = PassthroughSubject<Int, Never>()
let publisher2 = PassthroughSubject<String, Never>()
publisher1.zip(publisher2).sink {
print("P1: \($0), P2: \($1)")
}
publisher1.send(1)
publisher1.send(2)
publisher2.send("3")
publisher2.send("4")
publisher1.send(5)
Output
P1: 1, P2: 3
P1: 2, P2: 4
- 두 publisher는 서로의 데이터와 짝이 지어졌을 때만 데이터가 반환된다.
'🍎 Apple > Combine & Rx' 카테고리의 다른 글
[Combine] timer (by Runloop, Timer Class, DispatchQueue) (2) | 2022.01.13 |
---|---|
[Combine] Operator (4): Sequence Operator (0) | 2022.01.12 |
[Combine] Operator (2): Filtering Operator (0) | 2022.01.12 |
[Combine] Operator (1): Transforming Operator (0) | 2022.01.10 |
[RxSwift] Reactive Programming & RxSwift (0) | 2022.01.02 |