티스토리 뷰

반응형




안녕하세요. 멍구에요. 오늘은 Subject, PassthroughSubjecct, CurrentValueSubject등의 개발자문서를 읽어보도록 하겠습니다.
피드백 댓글 언제든 환영합니다. 감사합니다. 😁
✓ 관련 핑구님 포스팅

[iOS] Subject  - Combine 공부 4

안녕하세요 Pingu입니다.🐧 지난 글에서는 Apple에서 미리 정의해둔 Publisher들을 알아봤었는데, 이번 글에서는 이어서 Publisher 프로토콜을 채택하는 또 다른 녀석들인 Subject들에 대해서 알아보려고

icksw.tistory.com




Combine, Subject Protocol

Combine의 Publisher프로토콜을 채택하는 Subject에 대한 개발자문서 내용을 가볍게 보겠습니다.

Protocol로 되어있는 Subject는 외부 호출자가 요소를 발행하기 위한 메서드를 방출하는 Publisher입니다.



Declaration

Subject Protocol은 Publisher 프로토콜을 채택하고 있습니다. (AnyObject는 모든 클래스들이 암시적으로 채택하고 있는 프로토콜입니다.)

Overview

Subject는 send(_:) 메서드를 호출해서 stream에 값을 "주입"하기 위해 사용할 수 있는 Publisher입니다. 기존에 존재하는 명령형 코드를 Combine 모델에 적용하고자 할때 유용하게 사용가능합니다.



CurrentValueSubject

CurrentValueSubject는 단일 값을 싸고 있고, 값이 변경될 때마다 새로운 값을 발행하는 class입니다.



Declaration

CurrentValueSubject는 final class로 선언되어 있으며, Output, Failure타입을 갖습니다.
PassthroughSubject와 다르게, CurrentValueSubject는 가장 최근에 발행된 요소를 버퍼에 저장합니다. CurrentValueSubject 상에서 send(_:) 메서드를 호출하는 것또한 현재의 값을 업데이트해주며, 이는 직접적으로 값을 업데이트하는 것과 동일하게 됩니다.
CurrentValueSubject는 생성당시에 초기값이 존재해야합니다. 초기값을 바탕으로 이후 값이 변경될때마다 갱신이됩니다.

// * currentValueSubject 초기값 : "MungGu 첫번째 값"
let currentValueSubject = CurrentValueSubject<String, Never>("MungGu 첫번째 값")
currentValueSubject
    .sink(receiveCompletion: { print("1번째 sink completion: \($0)") },
          receiveValue: { print("1번째 value : \($0)") })
currentValueSubject
    .sink(receiveCompletion: { print("2번째 sink completion: \($0)") },
          receiveValue: { print("2번째 value: \($0)") })
currentValueSubject
    .sink(receiveCompletion: { print("3번째 sink completion: \($0)") },
          receiveValue: { print("3번째 value: \($0)") })
// currentValueSubject 구독자들에게 send(_:) 메서드를 호출하여 새로운 값을 보낸다.
// * currentValueSubject 최신 값 : "MungGu 첫번째 값" -> "MungGu 두번째 값"
currentValueSubject.send("MungGu 두번째 값")
currentValueSubject.send(completion: .finished)

// currentValueSubject의 value 값은 "MungGu 두번째 값" 으로 갱신되어있음
print(currentValueSubject.value)

위 코드는 currentValueSubject의 사용 예시를 보여주는 코드입니다. currentValueSubject 생성 시에는 초기값을 설정해주어야 합니다. 이때 초기값을 "MungGu 첫번째 값"으로 설정하였습니다.
이후 currentValueSubject를 구독하는 Subscriber를 3개 생성했습니다. 이후 currentValueSubject.send 메서드를 사용하여 currentValueSubject의 value값을 갱신해주었습니다. 이로서 currentValueSubject의 value는 "MungGu 두번째 값"이 됩니다.
currentValueSubject의 value 값이 갱신되었으므로 이 값을 구독자들에게 전파합니다. 결과적으로 마지막에 currentValueSubject.value를 출력하면 갱신된 값인 "MungGu 두번째 값"이 출력되게 됩니다. 위 코드의 실행 결과는 아래와 같습니다. currentValueSubject는 최신값만 저장하고 있는 것을 확인하실 수 있습니다.




PassthroughSubject

PassthroughSubject는 downstream 구독자(subscribers)들에게 값을 전파해주는 subject로, CurrentValueSubject와 달리 초기값을 필요로 하지 않습니다. currentValueSubject와 사용방법은 크게 차이가 없지만, value 값을 접근못한다는 점, 최신값을 저장하지 않고 있다는 점이 PassthroughSubject의 큰 특징입니다.



Declaration

PassthorughSubject는 CurrentValueSubject와 동일하게 final class 형태로 선언되어있습니다.

Overview

PassthroughSubject는 기존의 명령형 코드를 Combine 모델로 적용할때 편리한 방법을 제공해주는 Subject class입니다. 앞서 말했던것처럼 CurrentValueSubject와 다르게 PassthroughSubject는 최근 발행된 요소와 관련된 초기값이나 버퍼를 갖고있지 않습니다. 또한 만약 구독자가 없거나, demand값이 0일 경우, PassthroughtSubject는 값들을 버립니다.

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함