CurrentValueSubject

제네릭 클래스 | 하나의 값을 감싸고 값이 변화할 때마다 새로운 요소를 내는 Subject

PassthroughSubject와는 다르게 초기값을 가지며, 가장 최근에 발행된 요소에 대한 버퍼를 유지한다.

두 개의 제네릭 타입을 가진다. 하나는 값의 타입을 나타내며, 다른 하나는 에러의 타입을 나타낸다. 에러의 타입은 Error 프로토콜을 채택해야 한다.

이니셜라이저에 발행할 초기값을 넘겨주어 인스턴스를 생성한다.

value 프로퍼티를 통하여 해당 Subject가 감싼 값에 접근할 수 있다.

let subject = CurrentValueSubject<Void, Never>(Void())
subject
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine CurrentValueSubject Error")
    case .finished:
      print("Combine CurrentValueSubject Finish")
    }
  }, receiveValue: {
    print("Combine CurrentValueSubject")
  })
  .store(in: &cancellables)

subject.send(Void())

// Combine CurrentValueSubject
// Combine CurrentValueSubject

초기값을 설정하였으므로 subject를 구독한 순간에 값을 받은 것에 대한 클로저가 실행된다.

이후 subject.send(Void())를 호출하여 Subject에 값을 전달하였으므로 값을 받은 것에 대한 클로저가 한 번 더 실행된다.

RxSwift

BehaviorSubject를 사용하여 구현할 수 있다.

let subject = BehaviorSubject(value: Void())
subject
  .subscribe(onNext: {
    print("RxSwift CurrentValueSubject")
  }, onError: { _ in
    print("RxSwift CurrentValueSubject Error")
  }, onCompleted: {
    print("RxSwift CurrentValueSubject Finish")
  })
  .disposed(by: disposeBag)

subject.onNext(Void())

// RxSwift CurrentValueSubject
// RxSwift CurrentValueSubject

onNext(_:) 메소드를 사용하여 Subject에 값을 전달한다.

ReactiveSwift

MutableProperty를 사용하고 producer 프로퍼티를 통해 SignalProducer를 만들어 구현할 수 있다.

let property = MutableProperty(Void())
property.producer
  .start { event in
    switch event {
    case .value:
      print("ReactiveSwift CurrentValueSubject")
    case .failed:
      print("ReactiveSwift CurrentValueSubject Error")
    case .completed:
      print("ReactiveSwift CurrentValueSubject Finish")
    default:
      break
    }
  }

property.value = Void()

// ReactiveSwift CurrentValueSubject
// ReactiveSwift CurrentValueSubject
// ReactiveSwift CurrentValueSubject Finish

value 프로퍼티에 값을 할당하여 Property에 값을 전달한다.

MutableProperty로부터 signal 프로퍼티를 통해 Signal을 만들어 사용한다면, MutableProperty의 초기값이 흐르게 되지 않으므로 CurrentValueSubject의 동작을 구현할 수 없다.

스코프를 벗어날 때 property가 해제되어 SignalProducer도 종료하는 모습을 보여준다.

참고

ReactiveX - Subject

Last updated