새로운 프로젝트 2, 3주차 회고

김상인·2024년 5월 22일

자취방 주거문제와 개인적인 일 등 여기저기 타지에 다닐 일이 많아 Xcode를 실행시킨 날이 정말 얼마 없었다,, 2, 3주차 몰아서 회고한 이유도 앞과 같은 상황때문이다. 그래도 조금이라도 진행했으니 프로젝트 상황을 회고해보자.

진행현황

API 데이터를 불러와서 연속적으로 검색하는데 한계가 있었다. 그래서 한번 불러올 때마다 10개로 제한을 했었는데 검색API를 요청하는 메서드에서 약간의 딜레이를 주니 올바르게 작동하였다. Task.sleep(nanoseconds:)는 현재작업을 지정한 나노초만큼 일시정지하게 해준다. 기본 스레드는 차단하지 않는다고 해서 다른 작업에는 크게 영향을 줄 것 같지는 않다. 그러나 100개의 검색 기준으로 0.05초 정도까지가 에러나지 않는 딜레이라서, 지도에 마커가 그려지기까지 시간이 좀 걸린다. 검색량과 딜레이의 적절한 조율이라던지 하는 대책이 필요하다.

그리고 목록에서 중복되는 장소는 reduce로 중복을 걸러내어 구조체 배열을 재정의 하였다. 그런데 전체 데이터가 아닌 List에서만 적용되는 데이터로 따로 정의해서 이 부분도 조금 더 고민해봐야겠다.

마커를 선택하면 모달로 해당장소 검색결과를 띄우는 기능도 완성하였다. 해당장소의 정보를 정확히 띄워주면 좋겠다 싶었는데 네이버 URL을 참고해보니 place.naver.com/~~ 뒤에 오는 경로가 숫자로 나와있고 따로 쿼리나 파라미터가 키워드로 존재하지 않는다. 이 기능 구현도 조금 아쉬워서 시간이 난다면 더 정보를 찾아볼 예정이다.

마커 선택 시 Modal중복 장소 필터(장소 개수랑 List개수 일치)

이슈

1. Model에 해당하는 ViewController에서 상위 ViewController로 접근

modal sheet를 완전히 내려서 창을 닫았을 때, 지도에서의 마커를 다시 화면 중앙으로 카메라 이동하고 싶었다.
modal에 해당하는 ViewController에서 뷰가 완전히 사라졌을 때 실행되는 viewDidDisappear 메서드를 활용하기로 했다. 나의 상황은 MapViewController에서 present로 modal(WebViewController)을 띄웠기에 presentingViewController로 접근할 수 있을 것 같았다. presentingViewController는 해당 modal을 present한 ViewController를 반환한다고 한다.
그래서 viewDidDisappear 메서드 내에 presentingViewController를 활용해, MapViewController내의 카메라 이동에 관한 메서드를 실행하도록 하였다.
그러나 계속 카메라는 움직여지지 않았고 디버깅을 해봤는데 presentingViewController 반환값이 nil로 나왔다. 찾아보니 super.viewDidDisappear(animated)를 호출하면 presentingViewController가 nil로 된다고 한다. 슈퍼클래스에서 관련 작업을 수행할 때 nil로 비워주는 작업도 포함되어있나보다.
그리고 presentingViewController가 디버깅으로 확인할 때 MapViewController가 아닌 TabBarController로 나타났다. 현재 구조가 TabBarController에 3가지 ViewController로 연결되어있고, 그 중 MapViewController에서 모달을 띄워주는데 나는 당연히 MapViewController가 presentingViewController일줄 알았다. ChatGPT에 물어봤더니 좀 엉터리로 답변해서 신뢰가 가진않으나, TabBarController가 MapViewController를 포함하는 컨테이너이기 때문이라고 한다. 신뢰가 안가는 이유는 앱 구조를 설명 후, presentingViewController가 탭바컨트롤러를 반환하는지 맵뷰컨트롤러를 반환하는지를 물어봤는데 맵뷰컨트롤러를 반환한다고 했기 때문이다,, 탭바컨트롤러가 반환되었다고 말하니 탭바컨트롤러가 반환된 이유를 위처럼 설명해줬다,,
아무튼 위와 같은 사실을 알고, 모달을 띄우면서 webView를 불러올 때 presentingViewController를 담는 프로퍼티를 따로 만들어 구현해냈다.

2. Storyboard에서 modal로 연결이 되지않는 상황

storyboard에서 modal로 연결할 때는 보통 Button같이 이벤트를 발생시키는 트리거와 뷰를 연결하여 modal로 설정한다. 그러나 마커는 storyboard에 직접 그려주는 버튼이 아니기 때문에 연결이 되지않는 상황이다. 그래서 Code-base(외국에서는 programmatic이라 부르더라)로 연결해줬는데 webView가 계속 nil이여서 에러가 났다.

let webViewController = WebViewController()

아마 위의 코드로 접근해 present를 해줬을 것이다. 그런데 WKWebView타입의 webView가 자꾸 nil로 나오는 이유는 코드 기반으로 ViewController가 생성되기 때문에 스토리보드로 연결된 IBOutlet webView는 채택(?)되지 않는다는 것!

그래서 스토리보드 기반으로 ViewController를 생성하는 법은 스토리보드에서 해당 ViewController의 Storyboard ID를 작성해주고, storyboard!.instantiateViewController()를 활용하는 것이다.

let webViewController = self.storyboard!.instantiateViewController(withIdentifier: "WebViewController") as! WebViewController

이렇게 작성해주니 정상적으로 작동하였다. 스토리보드로 뷰를 만들어서 프로젝트를 진행할 땐 이 이슈랑 비슷한 일이 종종 발생할 것 같으니 잘 알아둬야겠다.

마무리

빨리 진행하고 빨리 마무리 짓고 싶었는데, 일이 자꾸 생기고 이사 준비까지 해야해서 더 늦춰질지도 모르겠다. 최소한의 기능 구현 후, 앱스토어에 출시하고 버전업하여 기능을 점점 추가하는 방식으로 진행할까도 생각중인데,,
암튼 순수 개발시간(일주일 조금 넘게?)에 비해 벌써 3주차가 지나갔다는게 너무 아쉽다.

profile
이것저것 해보기

0개의 댓글