세상을 더 편리하게
article thumbnail
Published 2022. 6. 26. 14:36
[swift] Combine - Subject Swift/Swift
728x90

2022.06.26 - [Main Programming/Swift] - [swift] Combine - Publisher & Subscriber

2022.06.26 - [Main Programming/Swift] - [swift] Combine - Subscriber - subscription

에 이어서 하겠습니다.

 

0. 시작

Combine에는 5개의 프로토콜이 있다고 했습니다.

- Publisher

- Subscriber

- Subject

- Scheduler

- Cancellable

이번 글에서는 Subject에 대해서 알아보겠습니다.

애플 공식 문서에 보면 정직하게 Publisher를 따르고 있는 프로토콜입니다.

그리고 이 공식문서의 하단을 쭉 보면 2개의 클래스가 보입니다. 이 두개를 이용해서 한 번 예시를 들어 봅시다.

    let currentValueSubject = CurrentValueSubject<String, Never>("Toby")
    
    let subscriber = currentValueSubject.sink(receiveValue: {
        print($0)
    })
    
    currentValueSubject.value = "Dodo"
    currentValueSubject.send("Jessica")
    
    /*
     Toby
     Dodo
     Jessica
     */

CurretnValueSubject는 Publisher를 따르기에 Publisher의 Output과 failure를 정해줘야 합니다.

여기서는 String과 Never를 통해서 지정해주었고 초기값으로 Toby를 주었습니다. ( 반드시 초기값을 줘야함 )

그리고 값이 변동되면 subscriber에게 값을 전달하는 모습을 볼 수 있습니다.

    let passthroughSubject = PassthroughSubject<String, Never>()
    
    let subscriber = passthroughSubject.sink(receiveValue: {
        print($0)
    })
    
//    passthroughSubject.value = "Dodo" -> ERROR
    passthroughSubject.send("Dodo")
    passthroughSubject.send("Jessica")
    
    /*
     Dodo
     Jessica
     */

PassthroughSubject는 초기값을 주지 않아도 무방합니다. 단, value에 직접 할당하지 못합니다.

반드시 send를 통하여서 Publisher가 값을 생성하도록 해야 합니다.

다음은 send(completion:) 에 대해서 알아 봅시다.

send(completion:)

Subscriber에게 전송이 완료되었다는 것을 알려주는 메소드 인것 을 알 수 있습니다.

send(subscription:)

Subject는 Publisher 프로토콜을 따릅니다. 그러니 subscribe(Subscriber:) 요청이 들어오면

subscription(구독권)을 subscriber에게 전달해줘야 합니다.

그러면 여기서 이 subscription(구독권)을 기본으로 Combine에서 제공하지만 때로는 커스텀해야 할 때도 있습니다.

이 때 send(subscription:)을 통해서 subscription(구독권)을 커스텀할 수 있습니다.

728x90

'Swift > Swift' 카테고리의 다른 글

[swift] Combine - Subscriber - subscription  (0) 2022.06.26
[swift] Combine - Publisher & Subscriber  (0) 2022.06.26
profile

세상을 더 편리하게

@쵱니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!