🎯 Trouble Shooting
[ 1. 가격순 정렬 삭제 - Response의 충분하지 않은 가게 가격 정보 ]
오늘 오전 가격순 정렬과 거리순 정렬을 구현하려고 API Response 정보를 찾아보고 있었는데
가격순을 구현하기 위해 필요한 가게들마다 가격 정보가 생각보다 부족하다는 것을 알았다.
가격순을 구현하기 위해 사용되는 정보는 2가지가 있는데
1. PriceLevel : 해당 장소의 가격대를 알려주는 지표
결과로 나오는 값으로는
1) PRICE_LEVEL_FREE = 무료
2) PRICE_LEVEL_INEXPENSIVE = 저렴함
3) PRICE_LEVEL_MODERATE = 보통
4) PRICE_LEVEL_EXPENSIVE = 비쌈
5) PRICE_LEVEL_VERY_EXPENSIVE = 매우 비쌈
이 있다.
2. PriceRange : 장소의 실제 가격 범위를 명시적으로 나타낸다
표현 방식으로는 일반적으로 "저렴한 가격"부터 "비싼 가격"까지의 범위를 숫자(예:1~4) 또는 통화 (예:$,₩ 등) 기반으로 표시된다.
이렇게 두 가지를 쓰면 가격순으로 정렬을 할 수 있을 거 같았는데
Postman으로 통해서 결과를 확인해 본 결과 절반 이상의 가게에서 정보를 주지 않는 것으로 확인되었다.
priceLevel 5개중 1개 / 10개중 3개 / 20개중 6개
priceRange 5개중 2개 / 10개중 6개 / 20개중 12개
메뉴마다 API 호출을 해서 나온 가게를 합치면 20개 정도가 되는데 그중 데이터를 주는 곳은 각각 6곳, 12곳으로 확인되었다.
따라서 팀원들과의 회의에서 해당 데이터는 가격순 정렬을 구현하는데 충분한 데이터가 되지 못한다고 생각이 되었고,
가격순은 정렬에서 제외하는 것으로 결정되었다.
👨🏻💻 오늘의 작업
[ 1. 거리순 정렬 구현 ]
정렬 버튼 선택시 구현 부분 코드
case .sortButtonTapped(let sortType):
let currentStoreInfo = currentState.storeInfo
// userDefualt 사용해서 위치 가져오기
let userLocation = UserDeafaultsManager.shared.readLocation()
let centerLat = userLocation?.lat ?? 37.5177 // 기본값: 강남역
let centerLon = userLocation?.lon ?? 127.0473
let sortedItems = currentStoreInfo.flatMap { $0.items }
.sorted { item1, item2 in
switch sortType {
case .rating:
return item1.rating > item2.rating
case .distance:
let distance1 = self.calculateDistance(
from: centerLat, lon1: centerLon,
to: item1.latitude, lon2: item1.longitude
)
let distance2 = self.calculateDistance(
from: centerLat, lon1: centerLon,
to: item2.latitude, lon2: item2.longitude
)
return distance1 < distance2
case .reviewCount:
return item1.userRatingCount > item2.userRatingCount
}
}
let sortedStoreInfo = [StoreSection(items: sortedItems)]
return Observable.just(.sortStore(sortedStoreInfo)) // storeInfo 정렬
거리 부분 case문 함수
case .distance:
let distance1 = self.calculateDistance(
from: centerLat, lon1: centerLon,
to: item1.latitude, lon2: item1.longitude
)
let distance2 = self.calculateDistance(
from: centerLat, lon1: centerLon,
to: item2.latitude, lon2: item2.longitude
)
return distance1 < distance2
현재 위치와 가게의 거리를 구하는 함수 코드
// 현재 위치와 가게의 거리를 구하는 함수
func calculateDistance(from lat1: Double, lon1: Double, to lat2: Double, lon2: Double) -> CLLocationDistance {
let location1 = CLLocation(latitude: lat1, longitude: lon1)
let location2 = CLLocation(latitude: lat2, longitude: lon2)
return location1.distance(from: location2)
}
[ 2. TableViewCell 레이아웃 수정 ]
종종 가게 이름이 길거나 주소가 긴 경우 원했던 위치를 벗어나 이미지부분까지 이어지는 문제가 있었다.
디자이너분들께 해당 문제를 말씀드리고 디자이너분들이 레이아웃을 수정해주셨다.
변경된 점은 width 값은 기존 242에서 222로 수정하고, Image 부분에 왼쪽으로 20만큼 여백이 생겼다.
// 식당명
storeNameLabel.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(20)
make.width.equalToSuperview().multipliedBy(0.592) // 13mini 기준 222
make.top.equalToSuperview().offset(26)
}
// 주소
addressLabel.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(20)
make.top.equalTo(rateLabel.snp.bottom).offset(4)
make.width.equalToSuperview().multipliedBy(0.592)
}
// 영업전/후 • 시간
openNowLabel.snp.makeConstraints { make in
make.leading.equalTo(timeImageView.snp.trailing).offset(4)
make.centerY.equalTo(timeImageView)
make.width.equalToSuperview().multipliedBy(0.540)
}
원하는 넓이인 222를 비율로 설정하기 위해서는 아이폰 13미니 가로 길이를 222로 나누면
내가 원하는 비율이 나온다. (0.592)
AutoLayout 제약 조건에서 해당 비율로 width을 잡아주면 원하는 Layout이 잡힌다.
[ 3. 팀원분과 Detail Reactor 병합 작업 ]
DetailView에서 Map을 담당하는 팀원분과 함께
각각 작업하던 Detail Reactor을 하나로 병합하는 작업을 하였다.
이 작업 이후로 맵과 테이블 뷰가 한 화면에서 보이게 되었다.
'스파르타 코딩 클럽 - iOS 스타터 6기 > 본 캠프' 카테고리의 다른 글
67. 스파르타 코딩 클럽 - 최종 팀 프로젝트 #9 (5) | 2025.06.18 |
---|---|
66. 스파르타 코딩 클럽 - 최종 팀 프로젝트 #8 (1) | 2025.06.17 |
64. 스파르타 코딩 클럽 - 최종 팀 프로젝트 #6 (1) | 2025.06.13 |
63. 스파르타 코딩 클럽 - 최종 팀 프로젝트 #5 (1) | 2025.06.12 |
62. 스파르타 코딩 클럽 - 최종 팀 프로젝트 #4 (0) | 2025.06.11 |