Publishers.RemoveDuplicates

제네릭 구조체 | 이전 요소와 일치하지 않는 요소만 발행하는 Publisher

이니셜라이저는 두 개의 인자를 받는다.

  • upstream : 상위에 흐르는 Publisher

  • predicate : 두 요소가 중복되었는지 평가하기 위한 클로저.

발행되려는 요소가 이전에 발행된 것과 일치한다면 해당 요소를 발행하지 않는다.

중복된 값이 들어오는 경우 같은 값을 반복 발행하는 것을 방지하기 위해 사용한다.

removeDuplicates 오퍼레이터와 관련이 있다.

해당 오퍼레이터를 사용할 때 Output 타입이 Equatable 프로토콜을 구현하고 있다면 predicate 클로저를 구현할 필요가 없다.

// Publishers.RemoveDuplicates Publisher
Publishers.RemoveDuplicates(upstream: Publishers.Sequence<[Int], Never>(sequence: [1, 2, 2, 2])) { $0 == $1 }
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine RemoveDuplicates Error")
    case .finished:
      print("Combine RemoveDuplicates Finish")
    }
  }, receiveValue: { value in
    print("Combine RemoveDuplicates : \(value)")
  })
  .store(in: &cancellables)

// removeDuplicates Operator
Publishers.Sequence<[Int], Never>(sequence: [1, 2, 2, 2])
  .removeDuplicates()
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine RemoveDuplicates Error")
    case .finished:
      print("Combine RemoveDuplicates Finish")
    }
  }, receiveValue: { value in
    print("Combine RemoveDuplicates : \(value)")
  })
  .store(in: &cancellables)

// Combine RemoveDuplicates : 1
// Combine RemoveDuplicates : 2
// Combine RemoveDuplicates Finish

상위에 흐르는 Publisher가 1, 2, 2, 2의 값을 차례대로 내는데, 2가 중복되어 내어질 때 무시된다. 그러므로 1, 2의 값을 차례대로 내고 종료하게 된다.

RxSwift

distinctUntilChanged 오퍼레이터를 사용하여 구현할 수 있다.

Observable.from([1, 2, 2, 2])
  .distinctUntilChanged()
  .subscribe(onNext: { value in
    print("RxSwift RemoveDuplicates : \(value)")
  }, onError: { _ in
    print("RxSwift RemoveDuplicates Error")
  }, onCompleted: {
    print("RxSwift RemoveDuplicates Finish")
  })
  .disposed(by: disposeBag)

// RxSwift RemoveDuplicates : 1
// RxSwift RemoveDuplicates : 2
// RxSwift RemoveDuplicates Finish

ReactiveSwift

skipRepeats 오퍼레이터를 사용하여 구현할 수 있다.

SignalProducer([1, 2, 2, 2])
  .skipRepeats()
  .start { event in
    switch event {
    case let .value(value):
      print("ReactiveSwift RemoveDuplicates : \(value)")
    case .failed:
      print("ReactiveSwift RemoveDuplicates Error")
    case .completed:
      print("ReactiveSwift RemoveDuplicates Finish")
    default:
      break
    }
  }

// ReactiveSwift RemoveDuplicates : 1
// ReactiveSwift RemoveDuplicates : 2
// ReactiveSwift RemoveDuplicates Finish

참고

ReactiveX - Operators - Distinct

Last updated