본문 바로가기
IOS🍎/Combine

[Combine] Subject란 (AnyPublisher)

by Jouureee 2022. 4. 17.

정의 :

publisher, subscriber와 같이 프로토콜이네요 ! 

그리고 subject는 사실 publisher랍니다. subject는 Publisher 프로토콜을 채택하고 있습니다.

그리고 send() 메소드를 통해 값을 주입합니다.

즉 publisher는 값을 가지고 있는 주체였다면 이 값에 다른 값을 주입할 수 있는 것이 바로 subject입니다.

 

subject는 다음과 같이 두가지 클래스로 구현될 수 있습니다.

  1. PassthroughSubject
  2. CurrentValueSubject

 


PassthroughSubject

downstream 구독자들에게 요소를 방출하는 broadcast 합니다.

예시를 봅시다.

PassthroughSubject를 만들어 subscriber1과 subscriber2를 만들었습니다. 

이때 send() 메소드를 사용해 값을 주입합니다.

broadcast 한다는 말은 subscriber가 여럿일때 해당 subject를 가지고 있는 모든 subscriber에게 값을 전달한다는 얘기입니다.

 

//subscriber1 : hey
//subscriber2 : hey
//subscriber1 : uri
//subscriber2 : uri
//subscriber1 : finished
//subscriber2 : finished

만약 subscriber의 구독을 중간에 취소한다면 아직 구독 중인 subscriber2에게만 uri가 출력될 것입니다.

 

 


 

CurrentValueSubject

PassthroughSubject와 달리 초기값 최근 발행된 element에 대한 buffer를 갖습니다.

예시를 봅시다.

초기값 "Uri"를 가지고 있고 최근 값으로 업데이트합니다.

subject는 값을 가질 수도, 발행할 수도 있기 때문에 value와 send를 가집니다.

//Uri
//안녕
//하이

Subject Type 삭제

만약 더이상 값을 발행하지 않게끔 하려면 (즉, send()가 더이상 필요 없을 시) subject 타입을 AnyPublisher<Int, Never> 타입으로 바꿀수 있습니다. 

let publisher = passthroughSubject.eraseToAnyPublisher()

 

 

AnyPublisher

다른 Publisher를 래핑하여 type 삭제를 수행하는 Publisher

Publisher의 또 다른 구체적인 구현으로 중요한 속성을 가지지 않아 업스트림 Publisher의 element 값을 전달하는데 사용

swift에서 타입이 없을때 Any, AnyObject를 사용하는 것처럼 타입이 없는(중요하지 않아서) publisher를 의미

publisher에는 Just, Fail, subject 등 다양한 타입의 publisher가 있는데 이 타입을 지워 사용합니다.

'IOS🍎 > Combine' 카테고리의 다른 글

[Combine] Cancellable이란  (0) 2023.04.17
[Combine] Scheduler란  (0) 2023.04.16
[Combine] ConnectablePublisher  (0) 2022.05.03
[Combine] Combine, Publisher, Subscriber 에 대해서  (0) 2022.04.17

댓글