AnyPublisher

μ œλ„€λ¦­ ꡬ쑰체 | νƒ€μž…μ„ μ§€μš΄ Publisher

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

  • upstream : νƒ€μž…μ„ μ§€μš°κ³  싢은 Publisher

Subscriberλ‚˜ λ‹€λ₯Έ Publisherμ—κ²Œ Publisher의 상세 νƒ€μž…μ„ λ…ΈμΆœν•˜κ³  싢지 μ•Šμ„ λ•Œ νŠΉμ • Publisherλ₯Ό AnyPublisher에 λž˜ν•‘ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

Combineμ—μ„œλŠ” 각각의 Publisherκ°€ Just, Fail, Publishers.Mapκ³Ό 같은 λ³„λ„μ˜ νƒ€μž…μ„ 가지며, 각 μ˜€νΌλ ˆμ΄ν„° λ˜ν•œ λ³„λ„μ˜ νƒ€μž…μ„ λ°˜ν™˜ν•œλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ΅œμ’… κ²°κ³ΌλŠ” νƒ€μž…μ„ μ§€μ›Œμ„œ 외뢀에 λ…ΈμΆœν•  ν•„μš”κ°€ μžˆλ‹€.

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

func combinePublisher() -> AnyPublisher<Void, Never> {
  Just(Void()).eraseToAnyPublisher()
}

combinePublisher()
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine AnyPublisher Error")
    case .finished:
      print("Combine AnyPublisher Finish")
    }
  }, receiveValue: {
    print("Combine AnyPublisher")
  })
  .store(in: &cancellables)

// Combine AnyPublisher
// Combine AnyPublisher Finish

RxSwift

RxSwift의 각 μ˜€νΌλ ˆμ΄ν„°λŠ” Observable의 κ°’μ΄λ‚˜ μ—λŸ¬μ˜ μ œλ„€λ¦­ νƒ€μž…μ„ λ°”κΎΈλŠ” κ²ƒμœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— νƒ€μž…μ„ μ§€μšΈ ν•„μš”κ°€ μ—†λ‹€. Observable이 AnyPublisher의 역할을 ν•˜λŠ” 것이닀.

func rxSwiftObservable() -> Observable<Void> {
  Observable.just(Void())
}

rxSwiftObservable()
  .subscribe(onNext: {
    print("RxSwift AnyPublisher")
  }, onError: { _ in
    print("RxSwift AnyPublisher Error")
  }, onCompleted: {
    print("RxSwift AnyPublisher Finish")
  })
  .disposed(by: disposeBag)

// RxSwift AnyPublisher
// RxSwift AnyPublisher Finish

ReactiveSwift

ReactiveSwift의 각 μ˜€νΌλ ˆμ΄ν„°λŠ” Signalμ΄λ‚˜ SignalProducer의 κ°’μ΄λ‚˜ μ—λŸ¬μ˜ μ œλ„€λ¦­ νƒ€μž…μ„ λ°”κΎΈλŠ” κ²ƒμœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— νƒ€μž…μ„ μ§€μšΈ ν•„μš”κ°€ μ—†λ‹€. Signalκ³Ό SignalProducerκ°€ AnyPublisher의 역할을 ν•˜λŠ” 것이닀.

func reactiveSwiftSignalProducer() -> SignalProducer<Void, Never> {
  SignalProducer(value: Void())
}

reactiveSwiftSignalProducer()
  .start { event in
    switch event {
    case .value:
      print("ReactiveSwift AnyPublisher")
    case .failed:
      print("ReactiveSwift AnyPublisher Error")
    case .completed:
      print("ReactiveSwift AnyPublisher Finish")
    default:
      break
    }
  }

// ReactiveSwift AnyPublisher
// ReactiveSwift AnyPublisher Finish

μ°Έκ³ 

Wikipedia - Type erasure

Last updated