티스토리 뷰
안녕하세요 :) Zedd입니다.
오늘은 Combine에 있는 multicast와 share라는 친구를 공부해보겠습니다.
그럼 바로 시작!
요 글을 읽기 전에,
https://zeddios.tistory.com/1009
ConnectablePublisher에 대한 이해가 있으시면 좋습니다.
multicast
멀티캐스트..라는 말은 어디선가 들어보셨을 겁니다!
컴퓨터 네트워크에서 멀티캐스트(multicast)란 한 번의 송신으로 메시지나 정보를 목표한 여러 컴퓨터에 동시에 전송하는 것을 말한다.
네...그렇습니다.
Combine에서의 multicast는
여러 구독자에게 element를 전달할 수 있는 subject / closure를 제공하는 친구입니다.
자 그럼 예제를 통해 알아봅시다.
자 이런 예제가 있습니다.
하나의 publisher가 있고, 그 publisher를 구독하는 구독자가 2개가 있네요.
print를 넣어놨으니, subscription(?) 과정이 상세하게 나올텐데요. 한번 봅시다.
자 보시면, 당연히 subsciber가 2개니까 subscription도 2번 일어난 것을 볼 수 있습니다.
첫번째 박스는 stream1꺼, 두번째 박스는 stream2에 대한 subscription입니다.
저는 그냥 receive subscription만 빨간색 박스로 쳤는데,
뭐 request unlimited(Demand)나 receive finish등 전부 stream마다 일어났죠.
이건 간단한 예제라서 괜찮지만, 업스트림 publisher가 네트워크 요청 수행과 같이 비싼 작업을 수행할 때,
구독자가 많아도 element당 하나의 receive(_:)이벤트가 발생했으면 좋겠는거에요.
어차피 받을 값도 똑같을텐데 말이죠.
궁극적으로 제가 하고싶은건,
이런거에요.
receive subscription, receive unlimited, receive value, receive finished
전부 한번씩만 일어난 것을 볼 수 있습니다.
그럴 때 이 multicast가 유용합니다!
그럼 사용해볼까요!?
멀티캐스트에는 궁극적으로...? subject가 들어가게 됩니다.
클로져로 만들던가 그냥 만들던ㄷ가..
저는 그냥 만들어서 넣어줄게요!
자..이제 위 코드를 돌리면
갑자기 아무것도 출력되지 않는 것을 보실 수 있습니다.
왜냐하면..multicast를 publisher에 해주게 되면,
Publishers.Multicast 타입이 되는데,
Multicast는 ConnectablePublisher를 채택하고 있슴.
즉....connect()를 호출하지 않는 이상.......요소를 publish하지 않는다? 뿌슝빠슝
마지막에 connect()를 호출하면
이쁘게
이러한 출력을 볼 수 있습니다.
share
share는 공유하다 라는 뜻을 가지고 있죠?
share를 호출하게 되면 여러 구독자와 업스트림 pulisher의 출력을 공유하게 됩니다.
여기까지의 생각 : 아니 어디서 많이 본 정의인데..multicast랑 모가 다른거지ㅎ?;;
네!!!!! 비슷하죠..!?
위에서 publisher에 multicast를 호출하면 publisher가 Publishers.Multicast타입이 됐잖아요~
이것도 똑같이 share를 호출하게 되면, publisher는 Publishers.Share타입이 됩니다.
Publishers.Share는 사실상 Publishers.Multicast 및 PassthroughSubject 게시자를
암시적으로 autoconnect ()와 결합한 것입니다.
!!!!!!!!!!!!!!!!!!!!!
ㅇㅇ multicast는 connect()를 호출하지 않으면 element를 publish하지 않았잖아요?
근데 share는 내부적으로 autoconnect를 호출(?)..하고있음.
그 말은 모다?
autoconnect가 이미 들어가있기 때문에 publisher를 sink하는 subscriber가 생기는 순간
값을 만들어내기 시작합니다.
밑에 출력부분을 보시면 알겠지만, cancellable2가 sink했음에도 불구하고 Stream1에 대한 출력밖에 안나왔죠.
그래서 애플은
delay......이용해서 첫번째 구독자가 publisher를 즉시 소모하지 못하게 한겁니다.
떼잉
만약 share가 없다면..
이렇게 receive이벤트가 2번씩 일어나겠죠!?!?!?
ConnectablePublisher공부하다가 여기까지 왔네요 ㅎㅎㅎㅎ 잼따
'Combine' 카테고리의 다른 글
Combine ) Operator (2) - Filtering Elements (1) | 2020.05.30 |
---|---|
Combine ) Operator (1) - Mapping Elements (0) | 2020.05.21 |
Combine ) ConnectablePublisher (0) | 2020.04.26 |
Combine + UIKit (2) | 2020.04.19 |
Combine (4) - Cancellable (0) | 2020.03.24 |
- FLUTTER
- UIBezierPath
- fastlane
- swift tutorial
- actor
- SwiftUI
- WWDC
- WidgetKit
- Swift
- swift delegate
- Xcode
- 회고
- github
- swift sort
- swift 공부
- 제이슨 파싱
- Combine
- 스위프트
- Accessibility
- 피아노
- WKWebView
- np-complete
- swift array
- Git
- swift3
- IOS
- iOS delegate
- 스위프트 문법
- ios 13
- np-hard
- Total
- Today
- Yesterday