switchToLatest는 Publisher가 받은 가장 마지막의 Publisher만 취급하는 함수입니다.

기능

사용

예를 들어 아래처럼 Publisher가 Publisher를 받을 수 있을 때

let publisher = PassthroughSubject<PassthroughSubject<Int, Never>, Never>()

subject에 몇 개의 Subject를 취급하게 하고 각각의 Publisher가 값을 발행하는 경우가 있다고 합시다.

let targetPublisher1 = PassthroughSubject<Int, Never>()
let targetPublisher2 = PassthroughSubject<Int, Never>()

publisher.send(targetPublisher1)

targetPublisher1.send(1)
targetPublisher1.send(2)

publisher.send(targetPublisher2)

targetPublisher1.send(3) <-- 여기 주목
targetPublisher2.send(4)
targetPublisher2.send(5)

그리고 일반적인 경우으로 구독을 받으려면 아래 코드처럼 진행했을거에요.

let cancellable = publisher.sink {
  $0.sink { value in
    print(value)
  }
  .store(in: &cancellables)
}

// 결과
1
2
3
4
5

하지만 만약 내가 마지막으로 보낸 publisher의 값만 취급하려면, 이때 switchToLatest()를 써주면 됩니다.

let cancellable = publisher.switchToLatest().sink { value in
  print(value)
}

/// 결과
1
2
4
5