[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Combine & Rx

[Combine] Operator (3): Combining Operator

inu 2022. 1. 12. 14:28
반응형

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는 서로의 데이터와 짝이 지어졌을 때만 데이터가 반환된다.
반응형