RxSwift + MVVM

김윤홍·2024년 8월 6일
0

ViewModel

프로퍼티로 비지니스 로직을 담당하는 Model 객체(Usecase)를 가지고 있다.

transform 함수: Input 스트림을 받아서 Model을 통해 비지니스 로직을 처리한 후, Operator를 통해 적절히 가공하여 반환한다.

Input - Output 모델링

참조글들
Github-CleanArchitecture
강남언니 MVVM

먼저 프로토콜을 하나 만들어줍니다.

프로토콜 생성 후 클래스에 프로토콜을 채택해줍니다.
사진에는 안보이지만 아래에는 transform함수도 구현되어 있습니다.

모든 사용자 이벤트를 ViewModel로 넘겨 비지니스 로직을 ViewModel에서만 처리를 해주기 위해 비동기로 처리될 이벤트들을 Input에 정의하고 View로 넘겨줄 데이터들을 Output으로 정의해준다.
transform에서는 input으로 받은 데이터들을 처리해 output으로 반환하도록 한다.

현재 제 코드는 Input과 Output이 하나씩이지만, 여러 이벤트가 들어와 가공하고, 비지니스 로직을 사용하고, 스트림 간의 합성등의 복잡한 작업을 한다면 Input, Output을 정리를 해 놓는것이 의도를 파악하기 쉬울것 같습니다.
확실한 로직분리와 코드의 가독성이 좋아집니다.

주의할점!
클로저 사용이 많아져서 강한 순환 참조를 신경써줘야한다.

그리고 가장좋았던점은 Input, Output을 적용해 코드를 작성해면서 데이터의 흐름등을 파악할 수 있어서 좋았습니다.


구독을 두번 누르면 구독취소?

View에서 사용자의 Input을 받아 Stream이 시작된다. 어떤 Stream을 관찰하는 Observable은 ViewModel에 선언되어있고, Stream을 구독하는 것을 결국 Input을 받았던 View에서 구독을 할것이다.

처음 RxSwift + MVVM을 구현하면서 가장 많이 하는 실수가 모든 곳에서 Subscribe을 한다는 것이라고 한다. View -> ViewModel로 이벤트를 전달할때 Subscribe ViewModel -> View로 이벤트를 전달할때 Subscribe.. 이는 Stream의 흐름을 방해하며 MVVM의 개념과 다르다

따라서 Subscribe는 Stream의 시작과 마지막인 ViewController에서 한번만 이뤄지는 곳이 좋다.

0개의 댓글

관련 채용 정보