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

Was this helpful?