문제
사용자가 원하는 국가의 환율만 제공하기 위해 Service의 fetchData() 메소드를 API 서버에서 데이터 파싱 -> 파싱 한 Entity를 Model에 맞게 정제하여 모델에 저장 -> 모델의 isChecked와 Realm 모델의 isCheck와 비교하여 true 값만 현재 모델(currencyModel) 값에 저장하여 컴플리션핸들러로 return하여 사용할 수 있게 구현했다.
현재 환율을 보여주는 CollectionView는 fetchData() 메소드를 이용하여 데이터를 받아와 바인딩하여 화면에 출력하도록 구현했다.
위의 사진과 같이 사용자가 모든 국가를 false로 하면 데이터를 받아오는 과정에서 filtering되는 데이터가 없어 현재 모델(currencyModel)에 아무런 값이 저장되지 않아 아래와 같이 인덱스를 벗어났다는 오류가 발생하게 된다.
해결 방법
내가 생각한 해결 방법은 총 두 가지 방법이다.
첫 번째, 사용자가 모든 CheckBox를 false로 하여 업데이트를 하려고 시도하면 조건 처리를 통해 사용자의 화면에 "한 개 이상의 국가를 선택해야 합니다."라는 팝업과 함께 업데이트를 하지 못하게 하고, 다시 업데이트를 시도하도록 하게 하는 방법
두 번째, 사용자가 모든 CheckBox를 false로 하여 업데이트를 하려고 시도하면 조건 처리를 통해 사용자의 화면에 "한 개 이상의 국가를 선택해야 합니다."라는 팝업과 함께 자동으로 상위 3개의 국가 (미국, 일본, 중국)을 true로 처리하여 강제로 업데이트를 하는 방법
두 번째 방법은 강제적으로 상위 3개의 국가를 업데이트하면 사용자에게 불쾌한 경험을 줄 수 있다고 판단되어 첫 번째 방법을 이용해서 문제를 해결했다.
해결
처음에는 ViewController에서 업데이트 완료 버튼을 Tapped 했을 때, 조건 처리를 하려고 했다. 하지만 ViewController는 Bind하여 View를 업데이트 하는 것 외에 비즈니스 로직에 직접적으로 관여하면 안된다고 생각을 하여 ViewModel의 업데이트 메소드에서 조건 처리를 하여 error 발생 시 onError 메소드를 실행 시키도록 클로저로 구현하였고, myCurrenyUpdate 메소드를 사용할 때 onError 클로저를 이용하여 오류 처리를 할 수 있게 구현했다.
NSCountedSet 메소드를 이용하여 item에서의 false의 개수가 총 개수와 동일하면(= item의 모든 isCheck가 false이면) onError를 이용하여 에러 처리를 할 수 있게 구현하였다.
에러 발생 시 커스텀 팝업 창을 띄우도록 했다.
커스텀 팝업은 간단하게 팝업 타이틀, 메세지 타이틀, 버튼 타이틀을 받아와 PopUp ViewController를 화면에 Present 하도록 했다.
간편하게 사용할 수 있도록 UIViewController에 extension하여 사용할 수 있게 하였다.
'ToyProject - 바꿔조 (환율 계산기)' 카테고리의 다른 글
[바꿔조/회고] 바꿔조 개발을 마무리 하며 (1) | 2024.01.29 |
---|---|
[바꿔조/문제해결] Realm 모델과 ExchangeRate 모델을 비교할 때 발생하는 오류 해결 (2) | 2024.01.27 |
[바꿔조] 바꿔조 중간점검 (24.01.01 ~ 24.01.24) (2) | 2024.01.24 |