✅ 구현하고자 하는 기능
- 상단에 가로 스크롤 카테고리 컬렉션뷰 (ex: 전체, 한식, 중식, 양식 등).
- 사용자가 카테고리 버튼을 누르면 아래에 관련된 결과를 보여주는 컬렉션뷰가 갱신됨.
- 데이터를 API로부터 가져오는 구조임.
이때,
- StoreCategory (상단 버튼들)는 앱 시작 시 1회 불러오면 되고
- 버튼 클릭 시 해당 카테고리에 맞는 다른 데이터를 불러와야 함
이때 외부 API를 요청하는 방식은 await / async를 사용할 예정
-> 관리 용이성 확보차원
func getStoreCategories() async throws -> [StoreCategory] {
// 카테고리 URL 구성
let urlString = "\(Constants.baseURLString)/categoryCode1?serviceKey=\(Constants.api_key)&numOfRows=10&pageNo=1&MobileOS=ETC&MobileApp=AppTest&contentTypeId=39&cat1=A05&cat2=A0502&_type=json"
guard let url = URL(string: urlString) else {
throw URLError(.badURL)
}
let (data, _) = try await URLSession.shared.data(from: url)
let decoded = try JSONDecoder().decode(CategoryResponse.self, from: data)
return decoded.response.body.items.item
}
func getData() {
let categoryURL = ""
guard let url = URL(string: categoryURL) else {
print("❌ URL 생성 실패")
return
}
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("❌ 에러 발생: \(error.localizedDescription)")
return
}
guard let data = data else {
print("❌ 데이터가 없습니다.")
return
}
do {
let decoded = try JSONDecoder().decode(CategoryResponse.self, from: data)
let categories: [StoreCategory] = decoded.response.body.items.item
print("✅ 필요한 카테고리만 출력:")
categories.forEach { print("- \( $0.name ) (\( $0.code ))") }
} catch {
print("❌ 디코딩 실패: \(error.localizedDescription)")
}
}
task.resume()
}
🔷 불러온 데이터를 확인할 목적으로 "JSONSerialization" 사용
// URLSession 데이터 요청
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("에러 발생: \(error.localizedDescription)")
return
}
guard let data = data else {
print("데이터가 없습니다.")
return
}
// JSON 파싱 시도
do {
if let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
print("받아온 JSON:")
print(jsonObject)
} else {
print("JSON 파싱 실패")
}
} catch {
print("JSONSerialization 에러: \(error.localizedDescription)")
}
}
// 요청 시작
task.resume()
'Project > HiddenGem' 카테고리의 다른 글
🔨 API 호출 함수 손 보기 (에러 처리 과정 적용) (0) | 2025.04.25 |
---|