- Published on
๐ Swift - RxSwift์์ Combine์ผ๋ก ์ ํํ๊ธฐ
- Authors
- Name
- ์ด์ฐฝ์ค
- RxSwift์์ Combine์ผ๋ก ์ ํํ๊ธฐ
- Observable โก๏ธ Publisher
- Observer โก๏ธ Subscriber
- Subscription
RxSwift์์ Combine์ผ๋ก ์ ํํ๊ธฐ
์ค๋์ RxSwift์์ Combine์ผ๋ก ์ ํํ๋ ๊ณผ์ ๊ณผ, ์ฃผ์ํ ์ ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด์ ํ์ตํ ๊ฒ๋๋ค!
์ฌ์ค ์ ์๊ฒ๋ ์ ํ์ด๋ผ๊ธฐ๋ณด๋ค๋, ๋ ๋ค ์์๋์! ๋ผ๋ ์์ด๊ธด ํ์ง๋ง์.
Observable โก๏ธ Publisher
๊ฐ์ฅ ๋จผ์ ๋์ ๋๋ ์ ์ Observable
์ ๋์๋๋ Publisher
์ผ๊ฒ๋๋ค.
class Observable<Element>: ObservableType {
func subscribe<Observer: ObserverType>(_ observer: Observer)
-> Disposable where Observer.Element == Element {
//
}
}
protocol Publisher<Output, Failure> {
associatedType Output
associatedType Failure: Error
func receive<S>(subscriber: S)
where S: Subscriber,
Self.Failure == S.Failure,
Self.Output == S.Input
}
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ Observable
์ ํด๋์ค ๊ตฌํ์ฒด์ด๊ณ , Publisher
๋ ํ๋กํ ์ฝ์ด๋ผ๋ ์ ์
๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Rx์์๋ ์ด Observable์ ํ ๋ฒ ๋ํํด์ ์ฌ์ฉํ๊ฑฐ๋, ์์์ ํ๊ณ subscribe
๋ฉ์๋๋ฅผ overrideํฉ๋๋ค. Combine์์๋ Publisher ํ๋กํ ์ฝ์ ์ฑํํ๊ณ receive
๋ฉ์๋๋ฅผ ๊ตฌํํด์ค์ผ๋ก์จ ์ปค์คํ
Publisher๋ฅผ ๊ตฌํํ ์ ์์ฃ .
๋ณดํต ์ ํ์ด ์ ๊ณตํ๋
Publisher
๊ตฌํ์ฒด๋ค์ ๊ตฌ์กฐ์ฒด๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
์ค์ ๋ก Rx์ Maybe
๋ Single
๊ฐ์ ๊ตฌํ์ฒด๋ค์ Observable์ ๋ํํ ํํ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.1
๋ํ Publisher๋ Failure
ํ์
์ ํ์๋ก ํฉ๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ฅผ ํญ์ ์ผ๋์ ๋๊ณ ๋ง๋ค์ด์ก๋ค๋ ์๋ฏธ์
๋๋ค.
๋ง์ฝ Failํ์ง ์๋ Publisher๋ฅผ ๋ง๋ค ๋๋, Never
๋ฅผ Failure๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
Observer โก๏ธ Subscriber
์ด๋ฒ์๋ ๋ฐ๋์ ์์น์ ์๋ "๊ตฌ๋ ์" ์ ๋๋ค.
RxSwift๋ Event
๋ผ๋ enum์ผ๋ก ๊ตฌ๋
ํ Observable์ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.2
@frozen
enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
๋ฐ๋๋ก Combine์ ์ด๋ฅผ enum์ผ๋ก ๊ตฌ๋ถํ์ง๋ ์๊ณ , ๋ณ๊ฐ์ ๋ฉ์๋๋ค์ ์ ๊ณตํด์ ๊ฐ๊ฐ์ ๋ํ ํธ๋ค๋ง์ด ๊ฐ๋ฅํ๋๋ก ๊ตฌํ๋์์ต๋๋ค.
protocol Subscriber<Input, Failure>: CustomCombineIdentifierConvertible {
associatedType Input
associatedType Failure: Error
func receive(subscription: Subscription)
func receive(_ input: Self.Input) -> Subscriber.Demand
func receive(completion: Subscribers.Completion<Self.Failure>)
}
@frozen
enum Completion<Failure> where Failure: Error {
case finished
case failure(Failure)
}
๊ฐ์ฅ ์ฐจ์ด์ ์ด๋ผ๊ณ ํ๋ค๋ฉด, Combine์ Subscriber๋ Publisher์ Failure
ํ์
๊ณผ ๋งค์นญํด์ ์ฌ์ฉํด์ผํ๋ค๋ ์ ์
๋๋ค.
RxSwift๊ฐ ๋ถํ์คํ ํ์
์ Error
๋ฅผ case๋ก ์ ๊ณตํด์ค๋ค๋ฉด, Combine์ ์ ํํ ํ์
์ Failure: Error
๋ฅผ receive(completion:)
๋ฉ์๋๋ฅผ ํตํด ์ ๊ณตํ๊ณ ์์ต๋๋ค.
Subscription
Subscription
์ Publisher์ Subscriber๋ฅผ ์ฐ๊ฒฐํ๋ ์ธ์คํด์ค๋ฅผ ํํํฉ๋๋ค.