-
Combine - ConnectablePublisherCombine 2022. 3. 28. 20:20
안녕하세요. 그린입니다🟢
이번 포스팅에서는 전 시간에서 multicast와 share를 학습하면서 살짝 스치듯이 말하고간
ConnectablePublisher에 대해 학습해보겠습니다🙋🏻
우선 만약 이전 포스팅인 multicast와 share를 못보셨다면 보고 오시는걸 추천해요!
https://green1229.tistory.com/230
이전 포스팅에서 언급한 ConnectablePublisher에 대한 회고
이전 포스팅에서 multicast에서 마지막 방출 처리 시 connect()를 해줘야한다했어요.
그 이유에 대해서는 multicast를 해주면 Publishers.Multicast 타입으로 변환되고 이 Multicast 타입이 ConnectablePublisher를 채택합니다.
결국 이 ConnectablePublisher의 특성상 connect()를 호출해야 요소 방출이 이뤄진다 했습니다.
자 그럼 이 대목을 한번 다시 상기시키고 바로 알아보시죠🏃🏻
ConnectablePublisher?
공식문서의 설명을 보면 연결 가능한 게시자라고 해요.
즉 퍼블리싱하는 게시를 연결 및 취소할 수 있는 수단을 제공합니다.
protocol ConnectablePublisher : Publisher
이렇게 앞서 말했듯 Publisher를 따르는 프로토콜입니다.
또한 connect()를 호출하지 않으면 요소 생성을 안합니다.
makeConnectable()를 호출해서 ConnectablePublisher를 생성할 수 있어요.
ConnectablePublisher 생성 및 사용
해당 타입으로 만든 Publisher에서 최종적으로 요소를 방출시켜주는 방법에는 두가지가 있습니다.
계속 언급되었던 connect()와 autoconnect() 입니다.
그럼 하나씩 간단히 알아보면서 사용해보죠!
connect()
func connect() -> Cancellable
공식문서의 정의는 이렇습니다.
게시자에 연결해서 요소 생성을 허용하고 게시 취소할 인스턴스를 반환해줍니다.
아까 위에서 계속 설명했던 connect()인데 이걸 해줘야 해당 Publisher에서 요소를 방출해준다고했죠?
한번 코드로 보시죠!
// ConnectablePublihser 생성 let publisher = [1, 2, 3, 4, 5] .publisher .makeConnectable() let cancellable = publisher.sink(receiveValue: { print("Num is \($0)") } // 요소 방출 publisher.connect()
이렇게 간단히 선언과 생성을 통한 후 방출까지 해줄 수 있습니다.
그럼 순차적으로 1, 2, 3, 4, 5의 프린트가 찍히겠네요!
autoconnect()
이건 connect()처럼 방출하고 싶을때 호출하지 않고 ConnectablePublisher을 생성 시 호출해줘서
자동으로 연결 및 취소 로직을 탈 수 있도록 해주는 친구입니다!
func autoconnect() -> Publishers.Autoconnect<Self>
정의는 이렇습니다.
연결 및 해제를 자동화해준다고 해요 역시!
또한 중요한 점은 꼭 업스트림에서만 호출해줘야 자동 연결된다고 합니다.
반환값이 업스트름 연결 가능한 게시자에 자동으로 연결되는 게시자라고 설명이 박혀있습니다!
그럼 코드로 사용을 보시죠!
// autoconnect 정상 사용 예시 let publisher = [1, 2, 3, 4, 5] .publisher .makeConnectable() .autoconnect() let cancellable = publisher.sink(receiveValue: { print("Num is \($0)") } // autoconnect 비정상 사용 예시 let publisher = [1, 2, 3, 4, 5] .publisher .makeConnectable() let cancellable = publisher.sink(receiveValue: { print("Num is \($0)") } publisher .autoconnect()
이렇게 정상적으로 업스트림에서 호출해 사용하면 되지만 아래와 같이 업스트림이 아닌 sink 이후에 호출한다면 작동하지 않습니다.
마무리
이렇게 간단히 ConnectablePublisher 프로토콜에 대해 알아봤습니다!
어떠신가요? 감이 오시나요..?
참 combine 하면 할수록 재미는 있는것 같은데 어렵네요!
다음엔 더 재미있고 어려운걸로 포스팅해보겠습니다🙌
[참고자료]
https://developer.apple.com/documentation/combine/connectablepublisher
'Combine' 카테고리의 다른 글
Combine - multicast / share (0) 2022.03.24 Combine - ObservableObject / @Published / @ObservedObject (0) 2022.03.17 Combine - Cancellable (2) 2022.03.10 Combine - Scheduler (0) 2022.03.07 Combine - Subject (0) 2022.02.28