티스토리 뷰
원래 기획했던 Home 탭에 UI는 Open API 에서 제공하는 데이터 구조와 달랐고,
원하는 대로 디자인을 기획하려면 1개 가게에 대한 정보들을 for문을 돌려 임의로
반려동물 동반할 수 있는 가게들에 대한 디테일한 정보들을 알려주는 Json 데이터들을 가져오게 한 뒤 pets라는 배열에 담았다.
또 데이터가 없는 상황을 대비하여 nil이 아닐 경우에만 pets라는 배열에 담도록 분기처리를 해주었다.
func fetchDetailPetStoreData(_ partCode: String) async {
do {
for num in 1 ... 250 {
let pets = try await webService.fetchPetData(url: "https://www.pettravel.kr/api/detailSeqPart.do?partCode=\(partCode)&contentNum=\(num)")
if pets[0].resultList != nil {
let petsData = WithPetCategory(partCode: partCode, results: pets)
self.pets.append(petsData)
}
}
print("완료")
} catch let error {
print(error.localizedDescription)
}
}
그런데 콘솔 창에 hit maximum timestamp count, will start dropping events 라는 경고가 떴다.
아직 정확히 이 경고에 대하여 구글 검색해봐도 시뮬 이슈만 있었다는 이야기 밖에 보지 못했지만, '이벤트 삭제를 시작할 것이다'라는 문구를 보았을 때 안전한 코드방식은 아닌 것 같다.
그래서 기존 API에서 데이터들이 어떤 것들은 있는 지 없는 지 파악이 되지 않아 걱정되어 CoreData나 Realm 로컬 DB를 사용하여 있는 데이터들을 잘 담아 JSON 데이터를 사용하는 것이 아닌 JSON으로 받아온 데이터들을 저장하는 DB를 사용하여 안전하게 관리해야겠다. 라는 짧은 생각을 했다. 그러고 바로 CoreData를 사용하려고 하는데 이미지 리스트의 타입을 [String]으로 받아야 해서 cutsom한 transformable 타입을 사용해야 했다. 그런데 using "NSSecureUnarchiveFromData" or a subclass of NSSecureUnarchiveFromDataTransformer instead. 에러가 떠서 아래 참고 링크 외에 다른 해결 방법들을 시도해보았지만 나의 에러는 해결되지 않았다.
참고 링크 : https://woongsios.tistory.com/83
구글링을 해보니 CoreData보다 Realm 이라는 오픈 소스 라이브러리가 조금 더 속도가 빠르고, 성능이 좋다는 문장을 보고 아주 얕은 지식으로 사용해보았는데 Persisted로 변수들을 선언함으로 모델을 만들어 사용한다.
위처럼 만든 Realm 모델을 통해 JSON 데이터 -> Realm에 저장하는 코드들도 짜주었다.
static func convertToList(_ withPetCategory: [WithPetCategory]) -> List<WithPet> {
let withPetList = List<WithPet>()
withPetCategory.forEach { model in
let withPet = WithPet()
let info = Info()
withPet.partCode = model.partCode
for result in model.results {
print(result)
info.contentSeq = result.resultList?.contentSeq ?? 0
info.areaName = (result.resultList?.areaName!)!
info.partName = (result.resultList?.partName!)!
info.title = result.resultList?.title ?? ""
info.keyword = (result.resultList?.keyword!)!
info.address = result.resultList?.address ?? "주소가 없습니다."
info.latitude = result.resultList?.latitude ?? ""
info.longitude = result.resultList?.longitude ?? ""
info.tel = result.resultList?.tel ?? ""
info.usedTime = result.resultList?.usedTime ?? ""
info.homePage = result.resultList?.homePage ?? ""
info.content = result.resultList?.content ?? ""
info.provisionSupply = result.resultList?.provisionSupply ?? ""
info.petFacility = result.resultList?.petFacility ?? ""
info.restaurant = result.resultList?.restaurant ?? ""
info.parkingLog = result.resultList?.parkingLog ?? ""
info.mainFacility = result.resultList?.mainFacility ?? ""
info.usedCost = result.resultList?.usedCost ?? ""
info.policyCautions = result.resultList?.policyCautions ?? ""
info.emergencyResponse = result.resultList?.emergencyResponse ?? ""
info.memo = result.resultList?.memo ?? ""
info.bathFlag = result.resultList?.bathFlag ?? ""
info.provisionFlag = result.resultList?.provisionFlag ?? ""
info.petFlag = result.resultList?.petFlag ?? ""
info.petWeight = result.resultList?.petWeight ?? ""
info.dogBreed = result.resultList?.dogBreed ?? ""
info.emergencyFlag = result.resultList?.emergencyFlag ?? ""
info.entranceFlag = result.resultList?.entranceFlag ?? ""
info.parkingFlag = result.resultList?.parkingFlag ?? ""
info.inOutFlag = result.resultList?.inOutFlag ?? ""
if (result.resultList?.imageList?.count ?? 0) > 0 {
// info.thumbNailImage = "\(String(describing: result.resultList?.imageList?[0]))"
info.thumbNailImage = result.resultList?.imageList?[0].image.description ?? ""
// info.firstContentImage = "\(String(describing: result.resultList?.imageList?[1]))"
// info.secondContentImage = "\(String(describing: result.resultList?.imageList?[2]))"
// info.thirdContentImage = "\(String(describing: result.resultList?.imageList?[3]))"
}
}
withPet.results = info
withPetList.append(withPet)
}
return withPetList
}
이렇게 잘 작동되는 것을 시뮬에서도 확인해보았는데 내가 간과한 사실이 하나 있었다...
로컬 DB 라는 거.....ㅋ
ㅋ
ㅋ
ㅋ
ㅋ
그러면 사용자가 앱을 실행할 때 버튼을 누르지 않고도 위 작업들이 모두 이루어져야 하는데...
앱 실행할 때 Launch 화면에서 데이터를 불러오게 할까도 생각해보았다.
하지만 궁극적으로 로컬 DB를 사용하고자 했던 이유가
1. 내가 원하는 UI로 그리려면 가게 하나에 대한 데이터 정보를 불러와야 하고,
2. 데이터가 있다가 없다가 온전하지 못해서 미리 저장해놓고 사용한다.
이거였기 때문에....
위에 삽질했던 과정이 심지어 안전한 방법이 아니어서 과감히 Realm은 다른 프로젝트에서 사용하기로 다짐했다.
그럼 위에 쓴 2가지 이슈를 해결하기 위해서 해결방법을 생각해봤는데
1. Open API 데이터 구조대로 UI를 바꾼다.
2. csv로 데이터를 수기로 작성한 다음에 파이어 베이스 firestore에 저장하여 getDocuments() 한다.
그런데 수기로 작성하는 것은... 시간도 걸릴 뿐더러
데이터를 가져와야할 때 모든 사용자들이 DB를 조회하려고 할텐데 그런 비용들을 생각한다면
1번이 지금으로서는 좋은 방법이라 다시 프로젝트를 정리했다.
진작에 생각할 걸......
괜히 욕심을 부렸다!
'에러 해결 일지 > 프로젝트 에러 해결' 카테고리의 다른 글
네트워크 통신 때 Escaping Closure의 역할.. 조금은 알 것도 같다. (0) | 2023.04.17 |
---|---|
리팩토링의 중요성 : Hashable 커스텀 고치기.. (0) | 2023.04.12 |
파이어베이스 스토리지에 사진이 업로드 및 다운로드 안될 때 방법 2가지 (0) | 2023.01.13 |
Cannot assign to property: 'self' is immutable (0) | 2022.12.05 |
SwiftUI: The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions (0) | 2022.12.05 |