-
RxSwift - SubscribeProgramming/RxSwift 2022. 3. 17. 21:39
안녕하세요 BeePeach입니다 :)
오늘 공부해볼 내용은 Subscribe입니다.
이전 포스팅에서 Observable을 생성해서 sequence를 정의했습니다.
그런데 정의만 하고 사용하지 않았죠?
Observable에서 정의한 이벤트들을 받기 위해서는 Subscribe(구독)을 해야 합니다.
Subcribe
그럼 어떻게 구독할 수 있을까요??
Observable과 Observer를 연결해주는 방법은 Observable에서 제공하는 subscribe(_:) 인스턴스 메서드를 사용하는 것입니다.
이 메서드는 ObservableType 프로토콜에 정의된 메서드인 것을 이전에 확인했었습니다.
subscribe(on:) 메서드는 파라미터로 escaping 클로저를 받고 Disposable을 리턴하는 메서드입니다.
Disposable은 다음 포스팅에서 자세히 다루겠습니다.
이 클로저는 Event를 파라미터로 받고 Void를 리턴합니다.
여기서 방출된 Event를 받아서 원하는 작업을 하면 됩니다. 그리고 escaping 클로저이기 때문에 async작업을 처리할 수 있습니다.
그럼 바로 사용해보도록 하겠습니다.
print로 어떤 이벤트가 전달되는지 확인해보니 우리가 정의했던 1, 2, 3이 next 이벤트에 담겨서 전달되고 마지막으로 completed가 호출됐습니다.
completed 이벤트가 전달된 이유는 of 오퍼레이터를 이용했기 때문입니다.
그리고 아마 Result를 사용하지 않았다는 경고 메시지가 뜰 텐데 이유는 리턴형인 Disposable을 아직 처리해주지 않았기 때문입니다.
처리하는 방법은 다음 포스팅에서 다룰 테니 여기서는 넘어가 주시면 됩니다.
클로저의 파라미터로 event가 전달되지만 우리가 원하는 것은 이벤트에 담긴 element입니다.
이번에는 클로저 단축 문법을 이용해서 간단하게 표현했습니다.
파라미터로 전달된 이벤트에 element라는 프로퍼티로 가져올 수 있습니다.
그런데 element는 Next에는 존재하고 Completed에는 존재하지 않기 때문에 옵셔널 타입입니다.
그래서 사용하려면 옵셔널 바인딩 후에 사용하게 됩니다.
그런데 매번 이렇게 하면 좀 귀찮을 거 같습니다.
그래서 다른 메서드도 제공해줍니다.
subscribe(onNext:onError:onCompleted:onDisposed:)
이 메서드는 각각 이벤트를 따로 클로저로 받아서 처리하는 메서드입니다.
마지막 onDisposed 파라미터는 처음 보는 이벤트죠?
이벤트의 종류는 Next, Completed, Error 3가지입니다.
이 이벤트는 Observable에서 방출하는 이벤트가 아닙니다.
이 클로저는 observable이 정상적으로 메모리에서 해제됐을 때 자동적으로 알아서 호출됩니다.
각각 파라미터의 타입을 보면 클로저입니다.
그리고 클로저의 파라미터를 보면 Event가 아니라 element를 받고 있습니다.
Next는 Int, Error는 Error, Completed와 Disposed는 element가 없고요!
즉 이 메서드는 element를 추출하는 코드가 따로 필요 없이 바로 element를 얻을 수 있습니다.
바로 확인해 볼까요?
옵셔널 바인딩 없이 next에 담긴 데이터를 바로 사용하는 것을 확인할 수 있습니다.
그리고 Completed가 호출이 된 후에 Disposed가 호출된 것도 확인할 수 있습니다.
이렇게 subscribe를 이용해서 Observable과 Observer를 연결하는 방법에 대해서 알아보았습니다.
흡사 우리가 많이 사용했던 NotificationCenter와 비슷하죠?
둘의 차이점이라면 NotificationCenter는 주로 싱글톤 객체를 공유해서 사용을 하지만 RxSwift에서 Observer는 각각 따로 분리되어 사용합니다. (물론 seqence를 공유해서 사용하도록 만들 수도 있습니다. 이건 이후에 operator를 공부할 때 알게 될 거예요.)
기본적으로는 Observable을 구독하게 되면 새로운 sequence가 생성됩니다.
그래서 만약 구독하는 코드를 10번 작성했다면 10개의 sequence에서 10개의 Observer에게 각각 데이터가 전달됩니다.
반면 NotificationCenter는 10개의 observe 코드를 작성한다고 해서 10개의 seqence가 생성되는 게 아닙니다.
Sequence에 비유하자면 1개의 sequence에 데이터를 전송하면 10개의 observer가 이를 받아서 데이터를 처리하는 방식입니다.
그리고 다른 차이점은 Observable은 구독을 하기 전까지 아무것도 하지 않습니다.
구독을 시작해야 비로소 Event를 방출합니다.
하지만 NotificationCenter는 구독자가 아무도 없어도 방출은 계속하게 됩니다.
참고자료
https://www.raywenderlich.com/books/rxswift-reactive-programming-with-swift
728x90'Programming > RxSwift' 카테고리의 다른 글
RxSwift - Trait (0) 2022.03.24 RxSwift - Observable factory (0) 2022.03.21 RxSwift - Disposable (0) 2022.03.17 RxSwift - Observable (0) 2022.03.05 RxSwift - 개요 (0) 2022.03.03