산책친구를 만들어보자!
심심한 산책길, 나와 함께 산책할 내 주변의 애견인들을 찾아 매칭시켜주는 앱 입니다.
6.0
프로필 설정화면, 채팅방 화면
반려견 프로필설정
산책위치 설정 화면
내 주변 친구찾기
상세 프로필
산책 위치는 위와 같이 지도 가운데의 손가락 모양이 가리키고 있는 좌표값을 이용해 Kakao Api 에서 해당 지역의 주소를 받아오게 됩니다.
이 기능을 구현하기 위해서 맵을 드래그 할 때마다 api 를 호출하여 손가락이 가리키는 위치의 주소를 받아왔었는데,
이때 두가지 문제가 발생했습니다.
드래그 할 때마다 api 호출이 너무 많이 일어나게 되고
빠른 속도로 맵을 움직이게 된다면 api 호출에 대한 Response의 순서가 뒤바뀌게 되어 잘못된 주소를 이용자의 화면에 노출시키게 되는 문제였습니다.
위의 문제들은 맵을 드래그 할 때마다 api 호출을 하는 방식때문이었습니다.
문제들을 해결하기 위해서 NMapsMap
의 문서를 통해 NMFMapViewCameraDelegate
의 메소드를 override 해서 드래그 이벤트가 끝나는 시점에 api 를 호출하여 api 호출 횟수를 최소화 하는 방식으로 문제를 해결했습니다.
NMFMapViewCameraDelegate
의 드래그 이벤트가 종료되는 시점에 호출되는 메소드 func mapView(_ mapView: NMFMapView, cameraDidChangeByReason reason: Int, animated: Bool) {
let coord = mapView.projection.latlng(from: walkPoint.center)
let param = RegioncodeParam(x: "\(coord.lng)", y: "\(coord.lat)")
KakaoAPIManager().requestRegioncode(param: param) { response in
self.walkLocationViewModel.setWalkLocation(walkLocation: response.documents.first!)
DispatchQueue.main.async {
self.addressLabel.text = response.documents.first?.address_name
}
}
}
이 프로젝트에서 구현하기 가장 어려웠던 인터페이스가 채팅방 이었습니다.
크게 3가지로 나눠 보자면,
1번
말풍선으로 표현될 TableViewCell 을 xib파일로 만들고, 오토레이아웃을 적용해서 구현했습니다. 이 과정에서 Resistance Priority
와 Stretching
에 대한 개념을 공부하고, 직접 적용해볼 수 있었습니다.
2번
메세지가 추가되어 TableView
에 Cell
이 추가될 때, tableView.reloadData()
를 사용했었습니다. 하지만 reloadData 를 할 경우 메세지 양이 많을 때에 새로고침되는 중 에 화면 깜빡임이 발생 했습니다. 이에 대해 찾아보니 tableView
의 전체 cell 을 reload
하기 때문에 화면 깜빡임이 발생한다는 걸 알게 되었고, cell 전체 를 reload
하기보다 tableView의 마지막 인덱스 위치에 cell 하나를 추가 하는 insertRows
를 이용하여 화면 깜빡임 문제를 해결했습니다.
// IndexPath 찾기
let lastIndexPath = IndexPath(row: chatRoomViewModel.messages.count - 1, section: 0)
// cell 추가
tableView.insertRows(at: [lastIndexPath], with: UITableView.RowAnimation.automatic)
3번
TableViewCell
의 개수가 화면에 표시할 수 있는 cell
의 개수보다 많아지게 되면 추가되는 cell
이 화면에 표시되지 않는 경우가 있었습니다.
이 문제를 해결하기 위해서 cell이 마지막 인덱스 위치에 추가될 경우, scroll의 위치를 가장 마지막 셀의 인덱스 위치로 이동 시켜주었습니다.
// 마지막 셀의 IndexPath를 찾기
let lastIndexPath = IndexPath(row: chatRoomViewModel.messages.count - 1, section: 0)
//scroll 이동
tableView.scrollToRow(at: lastIndexPath, at: UITableView.ScrollPosition.bottom
, animated: true)
기능 구현에만 집중하다보니 앱 실행중 예외처리에 대한 부분을 하나도 신경쓰지 못했습니다.
때문에 로그인한 유저의 정보
같은 중요한 정보들을 Optional 변수
에 저장 하도록 했는데, 유저 정보
를 불러오지 못할 경우 아예 앱 실행이 중지되는 문제와 같은 치명적인 문제들이 자주 발생하게 되었습니다.
고투개독은 iOS 프레임워크에 대한 기본적인 지식도 많이 부족한 상태로 시작하여 공부하면서 진행한 프로젝트 였습니다. 화면 전환
, ViewController 간의 데이터 교환
, AutoLayout
, 인터페이스 구현
부분에 있어서도 프로젝트 초반 과 후반 의 코드 작성 규칙
이 달라져 코드의 일관성 도 무너지게 되었습니다.
아쉬운 부분이 많았지만 앞으로 앱 개발시에 예외처리에 대한 부분
, 화면간의 데이터 교환 을 위한 Delegation
, Notification
, AutoLayout
등과 같이 앞으로 어떤걸 공부해야할지 감을 잡을 수 있었던 프로젝트였습니다.