Combining Operators

이세진·2022년 9월 20일
0

iOS

목록 보기
41/46

prepend


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를 추가할 수 있다.

append


let numbers = (1...5).publisher
numbers
    .append(100, 101)
    .sink {
    print($0)
}

// 출력값
1
2
3
4
5
100
101

prepend와는 반대로 output 뒤에 특정 값 또는 publisher를 추가할 수 있다.

switchToLatest


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한 마지막 구문은 출력되지 않았다.

merge


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을 합쳐서 한 구문에서 사용할 수 있다.

combineLatest


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의 값을 결합시켜준다.

zip


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을 담은 한 쌍의 투플을 반환한다.

profile
나중은 결코 오지 않는다.

0개의 댓글