Publishers.Merge

μ œλ„€λ¦­ ꡬ쑰체 | 두 개의 μƒμœ„ Publisher에 κ²°ν•© ν•¨μˆ˜λ₯Ό μ μš©ν•˜μ—¬ μƒμ„±λ˜λŠ” Publisher

μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” μ‘°ν•©ν•  두 개의 Publisherλ₯Ό λ°›λŠ”λ‹€.

μΈμžμ— λ“€μ–΄κ°€λŠ” λͺ¨λ“  Publisher의 Output νƒ€μž…κ³Ό μ—λŸ¬ νƒ€μž…μ€ κ°™μ•„μ•Ό ν•œλ‹€.

두 개의 μŠ€νŠΈλ¦Όμ„ ν•˜λ‚˜λ‘œ 합쳐 ν•˜λ‚˜μ˜ μŠ€νŠΈλ¦Όμ„ λ‹€λ£¨λŠ” κ²ƒμ²˜λŸΌ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  수 μžˆλ‹€.

merge μ˜€νΌλ ˆμ΄ν„°μ™€ 관련이 μžˆλ‹€.

let aSubject = PassthroughSubject<Int, Never>()
let bSubject = PassthroughSubject<Int, Never>()

// Publishers.Merge Publisher
Publishers
  .Merge(aSubject, bSubject)
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine Merge Error")
    case .finished:
      print("Combine Merge Finish")
    }
  }, receiveValue: { value in
    print("Combine Merge : \(value)")
  })
  .store(in: &cancellables)

// merge Operator
aSubject
  .merge(with: bSubject)
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine Merge Error")
    case .finished:
      print("Combine Merge Finish")
    }
  }, receiveValue: { value in
    print("Combine Merge : \(value)")
  })
  .store(in: &cancellables)

// 1
aSubject.send(1)
// 2
aSubject.send(2)
// 3
bSubject.send(3)
// 4
bSubject.send(4)

// Combine Merge : 1
// Combine Merge : 2
// Combine Merge : 3
// Combine Merge : 4

μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 λ™μž‘ν•œλ‹€.

  1. 1의 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ aSubject에 1의 값을 μ „λ‹¬ν•œλ‹€. ν•΄λ‹Ή PublisherλŠ” 1의 값을 λ‚Έλ‹€.

  2. 2의 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ aSubject에 2의 값을 μ „λ‹¬ν•œλ‹€. ν•΄λ‹Ή PublisherλŠ” 2의 값을 λ‚Έλ‹€.

  3. 3의 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ bSubject에 3의 값을 μ „λ‹¬ν•œλ‹€. ν•΄λ‹Ή PublisherλŠ” 3의 값을 λ‚Έλ‹€.

  4. 4의 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ bSubject에 4의 값을 μ „λ‹¬ν•œλ‹€. ν•΄λ‹Ή PublisherλŠ” 4의 값을 λ‚Έλ‹€.

RxSwift

merge μ˜€νΌλ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€.

let aSubject = PublishSubject<Int>()
let bSubject = PublishSubject<Int>()

Observable.merge(aSubject, bSubject)
  .subscribe(onNext: { value in
    print("RxSwift Merge : \(value)")
  }, onError: { _ in
    print("RxSwift Merge Error")
  }, onCompleted: {
    print("RxSwift Merge Finish")
  })
  .disposed(by: disposeBag)

aSubject.onNext(1)
aSubject.onNext(2)
bSubject.onNext(3)
bSubject.onNext(4)

// RxSwift Merge : 1
// RxSwift Merge : 2
// RxSwift Merge : 3
// RxSwift Merge : 4

ReactiveSwift

merge μ˜€νΌλ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€.

let aProperty = MutableProperty<Int>(0)
let bProperty = MutableProperty<Int>(0)

aProperty.signal
  .merge(with: bProperty.signal)
  .observe { event in
    switch event {
    case let .value(value):
      print("ReactiveSwift Merge : \(value)")
    case .failed:
      print("ReactiveSwift Merge Error")
    case .completed:
      print("ReactiveSwift Merge Finish")
    default:
      break
    }
  }

aProperty.value = 1
aProperty.value = 2
bProperty.value = 3
bProperty.value = 4

// ReactiveSwift Merge : 1
// ReactiveSwift Merge : 2
// ReactiveSwift Merge : 3
// ReactiveSwift Merge : 4
// ReactiveSwift Merge Finish

μ°Έκ³ 

ReactiveX - Operators - Merge

Last updated