Publishers.SwitchToLatest

μ œλ„€λ¦­ ꡬ쑰체 | μ€‘μ²©λœ Publisher듀을 ν‰ν‰ν•˜κ²Œ νŽ΄μ£ΌλŠ” Publisher

μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” ν•œ 개의 인자λ₯Ό λ°›λŠ”λ‹€.

  • upstream : μƒμœ„μ— 흐λ₯΄λŠ” Publisher

예λ₯Ό λ“€μ–΄ Publisher<Publisher<Data, NSError>, Never> νƒ€μž…μ˜ Publisher에 ν•΄λ‹Ή Publisherλ₯Ό μ μš©ν•˜λ©΄ Publisher<Data, NSError> νƒ€μž…μ˜ Publisherλ₯Ό 얻을 수 μžˆλ‹€.

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

// 1 : Publishers.SwitchToLatest Publisher
Publishers.SwitchToLatest(upstream: Publishers.Sequence<[Just<Int>], Never>(sequence: [Just(1), Just(2), Just(3)]))
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine SwitchToLatest Error")
    case .finished:
      print("Combine SwitchToLatest Finish")
    }
  }, receiveValue: { value in
    print("Combine SwitchToLatest : \(value)")
  })
  .store(in: &cancellables)

// 2 : switchToLatest() Operator
Publishers.Sequence<[Just<Int>], Never>(sequence: [Just(1), Just(2), Just(3)])
  .switchToLatest()
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine SwitchToLatest Error")
    case .finished:
      print("Combine SwitchToLatest Finish")
    }
  }, receiveValue: { value in
    print("Combine SwitchToLatest : \(value)")
  })
  .store(in: &cancellables)

// Combine SwitchToLatest : 1
// Combine SwitchToLatest : 2
// Combine SwitchToLatest : 3
// Combine SwitchToLatest Finish

μƒμœ„ PublisherλŠ” Just Publisherλ₯Ό λ°œν–‰ν•˜λŠ” Publishers.Sequence Publisher이닀. 이것에 switchToLatestλ₯Ό μ μš©ν•˜μ—¬ μƒμœ„ Publisherλ₯Ό ν‰ν‰ν•˜κ²Œ ν•΄μ£Όμ—ˆλ‹€.

결과적으둜 1, 2, 3의 값을 μ°¨λ‘€λŒ€λ‘œ λ‚΄κ³  μ’…λ£Œν•œλ‹€.

RxSwift

Observable λ³€ν™˜ μ˜€νΌλ ˆμ΄ν„° flatMap의 ν΄λ‘œμ €μ—μ„œ 인자λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•˜μ—¬ ν•΄λ‹Ή λ™μž‘μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

Observable.from([Observable.just(1), Observable.just(2), Observable.just(3)])
  .flatMap { $0 }
  .subscribe(onNext: { value in
    print("RxSwift SwitchToLatest : \(value)")
  }, onError: { _ in
    print("RxSwift SwitchToLatest Error")
  }, onCompleted: {
    print("RxSwift SwitchToLatest Finish")
  })
  .disposed(by: disposeBag)

// RxSwift SwitchToLatest : 1
// RxSwift SwitchToLatest : 2
// RxSwift SwitchToLatest : 3
// RxSwift SwitchToLatest Finish

ReactiveSwift

flatMap μ˜€νΌλ ˆμ΄ν„°μ˜ ν΄λ‘œμ €μ—μ„œ 인자λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•˜μ—¬ ν•΄λ‹Ή λ™μž‘μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

SignalProducer([SignalProducer(value: 1), SignalProducer(value: 2), SignalProducer(value: 3)])
  .flatMap(.concat) { $0 }
  .start { event in
    switch event {
    case let .value(value):
      print("ReactiveSwift SwitchToLatest : \(value)")
    case .failed:
      print("ReactiveSwift SwitchToLatest Error")
    case .completed:
      print("ReactiveSwift SwitchToLatest Finish")
    default:
      break
    }
  }

// ReactiveSwift SwitchToLatest : 1
// ReactiveSwift SwitchToLatest : 2
// ReactiveSwift SwitchToLatest : 3
// ReactiveSwift SwitchToLatest Finish

μ°Έκ³ 

ReactiveX - Operators - FlatMap

Last updated