MVVM 패턴으로 iOS 앱개발을 진행하고 있었는데, 진행하다가 ViewModel간에 데이터 통신이 필요한 경우가 생겼다.

사실 ViewModel간 데이터 통신을 한다는 것 자체가 MVVM패턴에 맞지 않는 구조라서 이 문제를 어떻게 해결해야하나 고민이 많이 되었다.

지금의 구조는 지도를 보여주는 MapView와 검색을 진행하는 SearchView가 있고, 각 뷰가 ViewModel을 가지고 있다. (VM = ViewModel)

Untitled

이때 Search에서 나온 결과 (장소)를 클릭하면 해당 좌표로 Map이 이동해야 한다.

Map의 center focus를 옮겨주는 부분은 MapVM에 들어있고, 검색을 진행하고 검색한 결과 배열을 리턴하는 부분은 SearchVM에 들어있다.

이 때, SearchVM에서 나온 결과 배열 중 클릭한 MapItem을 MapVM 내부의 함수에 전달해 주어야 했다. 처음엔 EnvironmentObject를 활용해서 해당 변수를 두 ViewModel에서 접근하는 방식으로 생각했었다.

하지만 하나의 모델에 두 ViewModel이 접근하는 형태가 MVVM패턴에 적합하지 않다고 판단했고, 많은 시간을 삽질하다가 두가지 장치를 활용해서 해당 문제를 해결하였다.

심지어 처음 생각한 방식은 정상적으로 작동하지도 않았다.

MVVM에 대한 이야기는 다음 포스팅에서 진행하기로 하고, 해결 방법을 알아보자.

EnvironmentObject 사용하기!

하지만 ViewModel에서는 EnvironmentObject를 사용할 수 없다!