PassthroughSubject

μ œλ„€λ¦­ 클래슀 | ν•˜μœ„ Subscriberμ—κ²Œ μš”μ†Œλ₯Ό μ•Œλ¦¬λŠ” Subject

μ‘΄μž¬ν•˜λŠ” λͺ…λ Ήν˜• μ½”λ“œλ₯Ό Combine λͺ¨λΈλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜κΈ° μœ„ν•΄ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©λ  수 μžˆλ‹€.

CurrentValueSubjectμ™€λŠ” λ‹€λ₯΄κ²Œ μ΄ˆκΈ°κ°’μ„ 갖지 μ•ŠμœΌλ©°, κ°€μž₯ μ΅œκ·Όμ— λ°œν–‰λœ μš”μ†Œμ— λŒ€ν•œ 버퍼λ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€. ν˜„μž¬ Subjectκ°€ 가지고 μžˆλŠ” 값에 μ ‘κ·Όν•  μˆ˜λ„ μ—†λ‹€.

두 개의 μ œλ„€λ¦­ νƒ€μž…μ„ 가진닀. ν•˜λ‚˜λŠ” κ°’μ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λ©°, λ‹€λ₯Έ ν•˜λ‚˜λŠ” μ—λŸ¬μ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚Έλ‹€. μ—λŸ¬μ˜ νƒ€μž…μ€ Error ν”„λ‘œν† μ½œμ„ 채택해야 ν•œλ‹€.

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

subject.send(Void())

// Combine PassthroughSubject

subject.send(Void())λ₯Ό ν˜ΈμΆœν•œ μ‹œμ μ— Subject에 값을 μ „λ‹¬ν•˜μ˜€μœΌλ―€λ‘œ 값을 받은 것에 λŒ€ν•œ ν΄λ‘œμ €κ°€ μ‹€ν–‰λœλ‹€.

RxSwift

PublishSubjectλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€.

let subject = PublishSubject<Void>()
subject
  .subscribe(onNext: {
    print("RxSwift PassthroughSubject")
  }, onError: { _ in
    print("RxSwift PassthroughSubject Error")
  }, onCompleted: {
    print("RxSwift PassthroughSubject Finish")
  })
  .disposed(by: disposeBag)

subject.onNext(Void())

// RxSwift PassthroughSubject

onNext(_:) λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ Subject에 값을 μ „λ‹¬ν•œλ‹€.

ReactiveSwift

MutablePropertyλ₯Ό μ‚¬μš©ν•˜κ³  signal ν”„λ‘œνΌν‹°λ₯Ό 톡해 Signal을 λ§Œλ“€μ–΄ κ΅¬ν˜„ν•  수 μžˆλ‹€.

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

property.value = Void()

// ReactiveSwift PassthroughSubject
// ReactiveSwift PassthroughSubject Finish

value ν”„λ‘œνΌν‹°μ— 값을 ν• λ‹Ήν•˜μ—¬ Property에 값을 μ „λ‹¬ν•œλ‹€.

MutablePropertyλ‘œλΆ€ν„° producer ν”„λ‘œνΌν‹°λ₯Ό 톡해 SignalProducerλ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•œλ‹€λ©΄, MutableProperty의 μ΄ˆκΈ°κ°’μ΄ 흐λ₯΄κ²Œ λ˜λ―€λ‘œ PassthroughSubject의 λ™μž‘μ„ κ΅¬ν˜„ν•  수 μ—†λ‹€.

μŠ€μ½”ν”„λ₯Ό λ²—μ–΄λ‚  λ•Œ propertyκ°€ ν•΄μ œλ˜μ–΄ Signal도 μ’…λ£Œν•˜λŠ” λͺ¨μŠ΅μ„ 보여쀀닀.

μ°Έκ³ 

ReactiveX - Subject

Last updated