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