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(구독권)을 커스텀할 수 있습니다.
'Swift > Swift' 카테고리의 다른 글
[swift] Combine - Subscriber - subscription (0) | 2022.06.26 |
---|---|
[swift] Combine - Publisher & Subscriber (0) | 2022.06.26 |